需求说明:

某银行一核心服务器部署了一个资金交易来往的系统,为了防止黑客入侵窃取数据,该银行专门开发了一款负责安全认证的智能机器人守护服务器,对外来访问做多重身份认证。现在要求你用套接字编程模拟实现这个认证过程。(智能机器人就是负责身份认证的服务器端,而你是客户端。)

编写Java程序,用套接字编程模拟实现银行认证过程_智能机器人

编写Java程序,用套接字编程模拟实现银行认证过程_socket_02

实现思路:


  1. 定义智能机器人的类,创建服务端,等待客户端连接;
  2. 定义客户端的类,去连接智能机器人这个服务端;
  3. 智能机器人被连接上以后,机器人给该客户端发送消息:enter password
  4. 客户端收到消息enter password后,给智能机器人发送密码:~!@#$%
  5. 智能机器人接收客户端消息,如果消息内容是~!@#$%,回一个消息给客户端告诉它:登录成功!,否则如果消息内容是logout,机器人主动断开连接,否则回一个消息给客户端告诉它:密码错误,登录失败!,并主动断开连接

实现代码:

服务端 RobotMain 类

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class RobotMain {
public static void main(String[] args) throws IOException {
// 创建 ServerScoket 实例,并在 9999 端口监听客户端
ServerSocket server = new ServerSocket(9999);
System.out.println("智能机器人监听在端口9999");
// 等待客户端的连接,客户端连接后,与客户端对应一个 Socket 管道
Socket socket = server.accept();

String data = null;//用于保存客户端传过来的数据
boolean flag = true;//用来判断是否循环
while (flag) {
/*使用socket.getInputStream()获取客户端的输入流,用来读取传来的数据
用InputStreamReader将字节流包装成字符流
用 BufferdReader 包装转换后的字符流*/
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("enter password");
writer.newLine();
writer.flush();
System.out.println("我说:enter password");
while ((data = reader.readLine()) != null) {
if (data.equals("logout")) {
flag = false;
if (reader!=null) {
reader.close();
}
if (writer!=null) {
writer.close();
}
writer.write("已经成功退出");
writer.newLine();
writer.flush();
}else if (data.equals("~!@#$%")) {
System.out.println("客户端说:"+data);
writer.write("登录成功!");
writer.newLine();
writer.flush();
}else {
System.out.println("客户端说:"+data);
writer.write("密码错误,登录失败!");
writer.newLine();
writer.flush();
}
}
reader.close();
writer.close();
}

}

}

客户端 lientMain 类

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class lientMain {

public static void main(String[] args) {
try {
// 客户端连接到本机端口号是 9999 的服务端
Socket socket = new Socket("127.0.0.1",9999);

String data = null;
boolean flag = true;
while (flag) {
BufferedReader localreader = new BufferedReader(new InputStreamReader(System.in));

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("机器人秘书说:"+reader.readLine());
while ((data = localreader.readLine()) != null) {
if (data.equals("esc")) {
flag = false;
if (reader!=null) {
reader.close();
}
if (writer!=null) {
writer.close();
}
writer.write("已经成功退出");
writer.newLine();
writer.flush();
}else {
writer.write(data);
writer.newLine();
writer.flush();
System.out.println("机器人秘书说:"+reader.readLine());
System.out.print("我说:");
}
}
reader.close();
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}