需求说明:
某银行一核心服务器部署了一个资金交易来往的系统,为了防止黑客入侵窃取数据,该银行专门开发了一款负责安全认证的智能机器人守护服务器,对外来访问做多重身份认证。现在要求你用套接字编程模拟实现这个认证过程。(智能机器人就是负责身份认证的服务器端,而你是客户端。)
实现思路:
定义智能机器人的类,创建服务端,等待客户端连接;
定义客户端的类,去连接智能机器人这个服务端;
智能机器人被连接上以后,机器人给该客户端发送消息:enter password
客户端收到消息enter password后,给智能机器人发送密码:~!@#$%
智能机器人接收客户端消息,如果消息内容是~!@#$%,回一个消息给客户端告诉它:登录成功!,否则如果消息内容是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(); } } }