需求描述
- 服务器端
- 搭建一个 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):

删除电影(碟中谍):

查看电影列表:
