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

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

需求说明:


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


50.pngimage.png



实现思路:

定义智能机器人的类,创建服务端,等待客户端连接;

定义客户端的类,去连接智能机器人这个服务端;

智能机器人被连接上以后,机器人给该客户端发送消息: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();
    }
  }
}


相关文章
|
9天前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
|
9天前
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
|
6天前
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
|
6天前
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
|
9天前
|
Java 开发工具
课时5:第一个Java程序
课时5介绍了编写第一个Java程序的步骤,包括创建Hello.java文件、编写“Hello World”代码、编译和运行程序。主要内容有:1) 新建并编辑Hello.java;2) 编译Java源文件生成.class文件;3) 通过命令行解释执行Java程序;4) 解释主方法的作用及信息输出操作。本课强调了类定义、文件命名规则和基本程序结构的重要性,并建议初学者使用记事本编写代码以熟悉基础语法。
|
2月前
|
传感器 安全 算法
消防救援支队消防员单兵装备智能养护舱电机驱动java版程序(二)
本文探讨消防救援中智能养护舱电机驱动的Java程序设计,作为系列文章第二部分。通过自动化和智能化手段,智能养护舱提升了装备维护效率与准确性。文章详细介绍了电机驱动模块的设计与实现,包括硬件选型、PID控制策略、安全保护机制及Java程序架构,确保电机精确控制、稳定性和安全性。未来将优化功能并引入智能算法和物联网技术,进一步提升装备维护智能化水平。
|
2月前
|
IDE Java 开发工具
消防救援支队消防员单兵装备智能养护舱点击驱动java版程序(一)
智能消防作战服架通过电机驱动系统提升消防员作业效率和安全性。本文介绍基于Java的电机驱动程序开发,涵盖硬件准备、软件环境搭建及驱动程序实现。重点包括串口通信配置、电机控制类设计与控制逻辑实现,确保电机高效稳定运行。通过正确配置通信协议和串口参数,并添加异常处理机制,保障系统的安全性和可靠性。
|
16天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
142 60
【Java并发】【线程池】带你从0-1入门线程池
|
5天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
55 23
|
12天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
81 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码

热门文章

最新文章