功能一:模拟用户登录
功能二:实现客户发送登录用户信息,服务器端显示登录信息并响应给客户端登录成功
这里设置的用户登录信息为:admin,123456
实现:
1.首先,服务端创建并启动服务器,并开放一个端口给客户端----服务端
ServerSocket serverSocket = new ServerSocket(1111);
Socket socket = serverSocket.accept();
2.在客户端创建Socket并连接到服务器----客户端
Socket socket = new Socket("127.0.0.1", 1111);
3.在客户端初始化输出流,用于向服务端发送数据----客户端
OutputStream os = socket.getOutputStream();
4.在客户端进行登录----客户端
System.out.println("------用户登录-------");
System.out.print("请输入用户名:");
String username = sc.nextLine();
System.out.print("请输入密码:");
String password = sc.nextLine();
5.将用户输入信息封装为User对象,并将其序列化发送给服务器,发送后关闭输出流,发送完成信号----客户端
User user = new User(username, password);
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(user);
socket.shutdownOutput();
6.在服务端打开输入流,接收客户端发送过来的数据流----服务端
InputStream is = socket.getInputStream();
7.在服务端,将输入流包装成对象输入流,用于读取序列化对象,并读取客户端传来的User对象----服务端
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User) ois.readObject();
8.服务端接收到用户登录信息后进行打印,并验证----服务端
System.out.println("服务器端:接收到用户登录请求:用户名:" + user.getUsername()
+ ",密码:" + user.getPassword());
String msg = null;if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){
System.out.println("服务器端:用户登录成功");
// 设置成功登录的消息,向客户端发送消息
msg ="欢迎【" + user.getUsername() + "】登录成功";
}else {
System.out.println("服务器端:用户登录失败");
// 设置登录失败的消息
msg ="用户名或密码错误,请重新登录";
}
9.在服务端进行验证后,将结果发送个客户端----服务端
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
10.客户端正在等待服务器的响应----客户端
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("服务器端:" + line);
}
11.别忘了最后要进行关闭哦
结果
先运行服务端在运行客户端
客户端运行结果:
服务端运行结果:
完整代码
客户端:
public class LoginClient {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);// 创建Socket连接到服务器Socket socket = new Socket("127.0.0.1", 1111);//打开输出流,初始化输出流,用于向服务器发送数据OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);// 用户登录界面交互System.out.println("------用户登录-------");System.out.print("请输入用户名:");String username = sc.nextLine();System.out.print("请输入密码:");String password = sc.nextLine();// 将用户输入封装为User对象User user = new User(username, password);// 将User对象序列化并发送给服务器oos.writeObject(user);// 关闭输出流,发送完成信号socket.shutdownOutput();//等待、接受服务器响应InputStream is = socket.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;while ((line = br.readLine()) != null) {System.out.println("服务器端:" + line);}//关闭输入流br.close();is.close();os.close();socket.close();}
}
服务端:
public class LoginServer {public static void main(String[] args) throws IOException, ClassNotFoundException {// 创建并启动服务器,监听1111端口ServerSocket serverSocket = new ServerSocket(1111);Socket socket = serverSocket.accept();//打开输入流,接收客户端发送过来的数据流InputStream is = socket.getInputStream();// 将输入流包装成对象输入流,用于读取序列化对象ObjectInputStream ois = new ObjectInputStream(is);// 读取客户端传来的User对象User user = (User) ois.readObject();// 打印接收到的用户登录信息System.out.println("服务器端:接收到用户登录请求:用户名:" + user.getUsername()+ ",密码:" + user.getPassword());String msg = null;// 验证用户登录信息if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())){System.out.println("服务器端:用户登录成功");// 设置成功登录的消息,向客户端发送消息msg ="欢迎【" + user.getUsername() + "】登录成功";}else {System.out.println("服务器端:用户登录失败");// 设置登录失败的消息msg ="用户名或密码错误,请重新登录";}// 获取输出流,向客户端发送消息OutputStream os = socket.getOutputStream();// 将消息转换为字节流并发送os.write(msg.getBytes());// 关闭相关资源os.close();ois.close();is.close();socket.close();serverSocket.close();}
}