• 模拟BIO实战--实现一个线程对应一个客户端


    模拟BIO实战–实现一个线程对应一个客户端

    由于是在本地测试,只编写服务器端(使用线程池),客户端连接用telnet模拟

    服务器端代码:

    package com.ws.bio;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @author 王顺
     * @description
     * @date 2022/8/2
     */
    public class BIOServer {
        public static void main(String[] args) throws IOException {
            //线程池机制
            //1.创建一个线程池
            //2.每次有客户端连接,就创建一个线程,与之通讯(单独写一个方法)
            ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
    
            //创建ServerSocket
            ServerSocket serverSocket = new ServerSocket(6666);
    
            System.out.println("服务器启动了");
    
            while (true) {
                //监听等待客户端连接
                Socket accept = serverSocket.accept();
                System.out.println("连接到一个客户端");
    
                //创建一个线程与之通讯(单独写一个方法)
                newCachedThreadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        handler(accept);
                    }
                });
    
            }
        }
    
        //编写一个handler方法,和客户端通讯
        public static void handler(Socket socket) {
            byte[] bytes = new byte[1024];
            //通过socket获取输入流
            try {
                System.out.println("当前线程信息id:" + Thread.currentThread().getId() + ",线程名称name:" + Thread.currentThread().getName());
                InputStream inputStream = socket.getInputStream();
                while (true) {
                    //读到byte里面
                    int read = inputStream.read(bytes);
                    if (read != -1) {
                        System.out.println(new String(bytes, 0, read));
                    } else {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                System.out.println("关闭和client连接");
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 大概思路就是:
      • 用Execute准备线程池。ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
      • 建立一个ServerSocket,确定一个端口,等待连接 。 ServerSocket serverSocket = new ServerSocket(6666);
      • 当有客户端连接的时候,新建线程处理,自己新建一个方法读取输入流
        • 确定连接:Socket accept = serverSocket.accept();
        • 新建线程: newCachedThreadPool.execute(new Runnable() {}实现Runnable接口的run抽象方法,进行该线程所要做的具体内容
        • 自定义方法:读取客户端输入流,用byte[]接收,并打印出来
          • 读取输入流:InputStream inputStream = socket.getInputStream();
          • byte[]接收:int read = inputStream.read(bytes);
          • 打印:System.out.println(new String(bytes, 0, read));

    telnet使用

    1. win10 window+R–>cmd
    2. 输入telnet 127.0.0.1 6666(6666为自定义端口号),就会自动跳转telnet命令行里面
    3. 在telnet里面输入!!!ctrl+]!!!进入指令模式
    4. 这时send ws,即可在项目控制台里面看到该输入。
  • 相关阅读:
    Yuan 2.0-M32 是一个基于 Yuan 2.0 架构的双语混合专家 (MoE) 语言模型,旨在以更少的参数和计算量实现更高的准确率
    最小生成树(Prim普利姆算法、Kruskal克鲁斯卡尔算法)
    LV.12 D12 GPIO实验 学习笔记
    洛谷P1201 贪婪的送礼者Greedy Gift Givers
    JAVAEE---多线程
    Ansible概述和模块解释
    第10章Tcl脚本编程(二)
    三刷操作系统之一文带你搞懂FreeRTOS——任务通知
    ESP8266-Arduino编程实例-MQ-8氢气传感器驱动
    商城系统架构设计与实现
  • 原文地址:https://blog.csdn.net/cxywangshun/article/details/126133741