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

需求说明:

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

实现思路:

  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();
		}
	}

}

 

posted @ 2020-10-13 19:50  明金同学  阅读(37)  评论(0编辑  收藏  举报