题目:
使用基于 tcp 协议的编程模型实现将 UserMessage 类型对象由客户端发送给服务器; 服务器接收到对象后判断用户对象信息是否为 “admin” 和 “123456”,若 是则将UserMessage对象中的类型改为"success",否则将类型改为"fail"并回发给客户端,客户端接收到服务器发来的对象后判断并给出登录成功或者失败的提示。
其中 UserMessage 类的特征有:类型(字符串类型) 和 用户对象(User 类型)。
其中 User 类的特征有:用户名、密码(字符串类型)。
如:UserMessage tum = new UserMessage(“check”, new User(“admin”, “123456”));
思路:
需要发送对象,则对象得继承序列化接口,直接套用TCP编程模型,重写对象里面的toString方法即可,具体代码如下。
视频:https://www.bilibili.com/video/BV1dv411h7zs/
User类:
package step1_task4_homework.tcp;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 3455205998719998398L;
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User(" + '\"' + name + '\"' + "," + '\"' + password + '\"' + ')';
}
}
UserMessage类:
package step1_task4_homework.tcp;
import java.io.Serializable;
public class UserMessage implements Serializable {
private static final long serialVersionUID = 2003051982579000384L;
private String type;
private User user;
public UserMessage() {
}
public UserMessage(String type, User user) {
this.type = type;
this.user = user;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "UserMessage(" +"\"" + type + '\"' + "," + user + ')';
}
}
TCPServerTest类:
package step1_task4_homework.tcp;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerTest {
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
try {
// 创建ServerSocket对象
ss= new ServerSocket(8888);
System.out.println("等待客户端连接。。。。");
// 等待客户端连接
s = ss.accept();
System.out.println("客户端连接成功!");
// 创建输入流
ois = new ObjectInputStream(s.getInputStream());
oos = new ObjectOutputStream(s.getOutputStream());
while (true){
// 读取接收到的信息
Object object = ois.readObject();
System.out.println("读取到的object值为" +object);
// 获取UserMessage里对象信息
UserMessage um = (UserMessage) object;
User user = um.getUser();
String userName = user.getName();
String password = user.getPassword();
String type = um.getType();
System.out.println("接收到的userName:" + userName + " password:" + password);
// 判断client端是否要下线
if ("bye".equals(type)){
System.out.println("客户端已下线!");
break;
}
// 判断收到的信息是否为admin和123456
if ("admin".equals(userName) && "123456".equals(password) ){
um.setType("success");
}else {
um.setType("fail");
}
// 回发数据给客户端
// oos = new ObjectOutputStream(s.getOutputStream());
// 发送um对象
oos.writeObject(um);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
// 关闭流和连接
try {
if (null != oos){
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != ois) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != s) {
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != ss){
ss.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCPClient类:
package step1_task4_homework.tcp;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class TcpClientTest {
public static void main(String[] args) {
UserMessage um = null;
Socket s = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
// 创建socket类型对象
s = new Socket("127.0.0.1",8888);
System.out.println("服务器连接成功!");
Scanner sc = new Scanner(System.in);
// 创建输出流
oos = new ObjectOutputStream(s.getOutputStream());
// 创建输入流
ois = new ObjectInputStream(s.getInputStream());
while (true){
System.out.println("简易客户端验证系统:");
System.out.println("1.登录 2.退出");
System.out.println("请输入序号");
int num = sc.nextInt();
if (1 == num){
System.out.println("请输入用户名:");
String name = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
// 将输入的用户名密码赋值给UserMessage对象
um = new UserMessage("check",new User(name,password));
}else if(2 == num){
System.out.println("退出系统。。。");
// 告诉server端客户端要下线了
um = new UserMessage("bye",new User("bye","bye"));
oos.writeObject(um);
break;
}
// 发送um对象
oos.writeObject(um);
// ois = new ObjectInputStream(s.getInputStream());
// 读取接收到的信息
Object object = ois.readObject();
// 获取UserMessage里对象信息
UserMessage umBack = (UserMessage) object;
String type = umBack.getType();
System.out.println("接收到的返回类型type:" + type);
if ("success".equals(type) ){
System.out.println("登录成功!");
System.out.println("欢迎进入系统。。。");
// 告诉server端客户端要下线了
um = new UserMessage("bye",new User("bye","bye"));
oos.writeObject(um);
break;
}else if ("fail".equals(type) ){
System.out.println("登录失败!请重新输入用户名密码!");
}else {
System.out.println("返回类型错误!请核对服务器端!");
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (null != ois){
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != oos) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (null != s) {
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}