TCP基础题:电影收藏管理系统

发布于:2025-05-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

需求描述

  • 服务器端
    • 搭建一个 TCP 服务器,监听本地的 7777 端口,支持多客户端连接。
    • 维护一个电影收藏列表,每个电影条目涵盖电影名称、导演、上映年份、评分等信息。
    • 能够响应客户端的这些请求:
      • 添加电影到收藏列表:接收客户端发送的 Movie 对象,利用 ObjectInputStream 读取后,添加到电影收藏列表。
      • 删除电影:接收客户端发送的电影名称,通过 ObjectInputStream 读取,从收藏列表中删除该电影。
      • 获取收藏列表:把当前的电影收藏列表封装成 MovieCollection 对象,借助 ObjectOutputStream 发送给客户端。
      • 按评分筛选电影:接收客户端发送的评分阈值,使用 ObjectInputStream 读取,筛选出评分大于等于该阈值的电影,封装成 MovieCollection 对象并使用 ObjectOutputStream 发送给客户端。
  • 客户端
    • 创建一个 TCP 客户端,连接到本地的 7777 端口。
    • 可以向服务器发送添加电影请求,创建 Movie 对象并使用 ObjectOutputStream 发送。
    • 可以向服务器发送删除电影请求,将电影名称用 ObjectOutputStream 发送。
    • 可以向服务器发送获取收藏列表请求,接收服务器返回的 MovieCollection 对象,使用 ObjectInputStream 读取并显示。
    • 可以向服务器发送按评分筛选电影请求,将评分阈值使用 ObjectOutputStream 发送,接收服务器返回的筛选结果并显示。
数据描述
  • Movie 类
    • String movieName:电影名称。
    • String director:导演。
    • int releaseYear:上映年份。
    • double rating:评分。
  • MovieCollection 类
    • ArrayList<Movie> movieList:电影收藏列表。

 Server和Client的Data,Movie和MovieCollection类 

        Movie类

import java.io.Serializable;

public class Movie implements Serializable {
    private String movieName;
    private String director;
    private int releaseYear;
    private double rating;

    public Movie() {
    }

    public Movie(String movieName, String director, int releaseYear, double rating) {
        this.movieName=movieName;
        this.director=director;
        this.releaseYear=releaseYear;
        this.rating=rating;
    }

    public String getMovieName() {
        return movieName;
    }

    public void setMovieName(String movieName) {
        this.movieName=movieName;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director=director;
    }

    public int getReleaseYear() {
        return releaseYear;
    }

    public void setReleaseYear(int releaseYear) {
        this.releaseYear=releaseYear;
    }

    public double getRating() {
        return rating;
    }

    public void setRating(double rating) {
        this.rating=rating;
    }

    @Override
    public String toString() {
        return "电影名称: " + getMovieName() + ", 导演: " + getDirector() + ", 上映年份: " + getReleaseYear() + ",评分:" + getRating() ;
    }
}

        MovieCollection类

import java.io.Serializable;
import java.util.ArrayList;

public class MovieCollection implements Serializable {
    private ArrayList<Movie> movieList;

    public MovieCollection() {
        this.movieList= new ArrayList<>();
    }

    public ArrayList<Movie> getMovieList() {
        return movieList;
    }

    public void addMovie(Movie movie) {
        movieList.add(movie);
    }

    public void removeMovie(String movieName) {
        movieList.removeIf(movie -> movie.getMovieName().equals(movieName));
    }

    public Movie chooseMovieByRating(int rating){
        for (Movie movie : movieList) {
            if (movie.getRating()>=rating){
                return movie;
            }
        }
        return null;
    }
}

        Data类(Data类启到一个把用户操作封装的作用,便于数据的打包和传输,方便程序编写的使用

import java.io.Serializable;

public class Data implements Serializable {

    private String op;
    private String movieName;
    private int movieRating;
    private Movie movie;

    public Data() {
    }

    public Data(String op) {
        this.op=op;
    }

    public String getOp() {
        return op;
    }

    public void setOp(String op) {
        this.op=op;
    }

    public Movie getMovie() {
        return movie;
    }

    public void setMovie(Movie movie) {
        this.movie=movie;
    }

    public void setMovieName(String movieName) {
        this.movieName = movieName;
    }

    public String getMovieName() {
        return movieName;
    }

    public void setMovieRating(int movieRating) {
        this.movieRating = movieRating;
    }

    public int getMovieRating() {
        return movieRating;
    }
}

客户端ClientMovie:

import com.zbMovie.entity.Data;
import com.zbMovie.entity.Movie;
import com.zbMovie.entity.MovieCollection;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;

public class ClientMovie {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Socket socket = new Socket("localhost", 7777);
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        String opWhat;
        String movieDelete;
        int movieRating;
        String msg;
        Data op = new Data();

        // 添加电影===============================================
        Movie movie = new Movie("大话西游", "周星驰", 2004,9);
//        Movie movie = new Movie("碟中谍", "汤姆克鲁斯", 1994,6);
        opWhat = "添加";

        //包装Data
        op.setOp(opWhat);
        op.setMovie(movie);
        //发送Data
        oos.writeObject(op);

        //接收系统发回的信息
        msg = (String) ois.readObject();
        System.out.println(msg);


        //删除电影===============================================
        opWhat = "删除";
        movieDelete = "碟中谍";

        //包装Data
        op.setOp(opWhat);
        op.setMovieName(movieDelete);
        //发送Data
        oos.writeObject(op);

        //接收系统发回的信息
        msg = (String) ois.readObject();
        System.out.println(msg);

        //评分查询===============================================
        opWhat = "评分查询";
        movieRating = 8;

        //包装Data
        op.setOp(opWhat);
        op.setMovieRating(movieRating);
        //发送Data
        oos.writeObject(op);

        //接收系统发回的信息
        msg = (String) ois.readObject();
        System.out.println(msg);

        // 查看电影列表===============================================
        opWhat = "查看电影列表";

        //包装Data
        op.setOp(opWhat);
        //发送Data
        oos.writeObject(op);

        //接收系统发回的歌单对象
        MovieCollection movieCollection = (MovieCollection) ois.readObject();
        //将歌单对象转换为集合并打印
        ArrayList<Movie>  movieList = movieCollection.getMovieList();
        for (Movie m : movieList) {
            System.out.println(m);
        }

    }
}

服务端Server:

        ServerThread类:

import com.zbMovie.entity.Data;
import com.zbMovie.entity.MovieCollection;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class ServerThread extends Thread {
    private Socket socket;
    private MovieCollection movieList;

    public ServerThread(Socket socket, MovieCollection movieList) {
        this.socket = socket;
        this.movieList = movieList;
    }

    @Override
    public void run() {
        ObjectInputStream ois =null;
        ObjectOutputStream oos =null;
        try {
            ois=new ObjectInputStream(socket.getInputStream());
            oos=new ObjectOutputStream(socket.getOutputStream());
            Data op = new Data();

            op =(Data) ois.readObject();

            switch (op.getOp()) {
                case "添加":
                    movieList.addMovie(op.getMovie());
                    System.out.println("添加电影: " + op.getMovie());
                    oos.writeObject("添加成功!");
                    break;
                case "删除":
                    movieList.removeMovie(op.getMovieName());
                    System.out.println("删除电影: " + op.getMovieName());
                    oos.writeObject("删除成功!");
                    break;
                case "评分查询":
                    String msg = "评分高于"+op.getMovieRating()+"的电影有:";
                    oos.writeObject(msg+
                          movieList.chooseMovieByRating(op.getMovieRating()).toString());
                    break;
                case "查看电影列表":
                    oos.writeObject(movieList);
                    System.out.println("返回给客户端电影列表");
                    break;
                }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                oos.close();
                ois.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

        Server类

import com.zbMovie.entity.MovieCollection;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(7777);
        System.out.println("服务器启动 端口:" + 7777);
        MovieCollection movieList = new MovieCollection();


        while (true) {
            Socket socket=serverSocket.accept();
            ServerThread serverThread = new ServerThread(socket, movieList);
            serverThread.start();
        }

    }
}

运行结果:

添加电影(分别添加):

查看电影列表:

评分查询(大于等于8):

删除电影(碟中谍):

查看电影列表:


网站公告

今日签到

点亮在社区的每一天
去签到