实现BIO多客户端通讯模式

news2025/7/23 15:17:42

实现BIO多客户端通讯模式

    • 背景
    • 思想
    • 实现
        • 服务端线程类
        • 服务端
        • 客户端
    • 结果

背景

 如果服务端需要处理很多个客户端的消息通信请求应该如何处理呢,此时我们就需要在服务端引入线程了,也就是说客户端每发起一个请求,服务端就创建一个新的线程来处理这个客户端的请求,这样就实现了一个客户端一个线程的模型

思想

服务端

  • 实现服务端可以同时接收多个客户潘的Socket通信需求。
  • 是服务端每接收到一个客户端socket请求对象之后都交给一个独立的线程来处理客户端的数据交互沾求。

服务端线程类

  • 处理服务端传来的数据将其输出

客户端

  • 获取输入的数据并发送给服务端

实现

服务端线程类

  1. 继承Thread线程类
  2. 创建有参构造方法
  3. 从Socket中获得字节输入流
  4. 使用缓冲字符输入流包装字节输入流
  5. 再将字符输入流输出出去
public class ServerThread extends Thread{
    private Socket socket;
    public ServerThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //从socket中得到字节输入流
            InputStream is = socket.getInputStream();
            //使用缓冲字符输入流包装字节输入流
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
            String msg;
            while ((msg = bfr.readLine())!=null){
                System.out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端

  1. 注册接口
  2. 定义死循环持续接收客户端的消息
  3. 创建线程类处理socket通讯信息
public class Server {
    public static void main(String[] args) {
        try {
            //注册接口
            ServerSocket ss = new ServerSocket(8686);
            //定义死循环持续接收客户端的消息
            while (true){
                Socket socket = ss.accept();
                //创建线程类处理socket通讯信息
                new ServerThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

  1. 请求与服务端创建连接
  2. 获取socket输出流包装成打印流
  3. 利用循环不断的发消息给服务端
public class Client {
    public static void main(String[] args) {
        try {
            //请求与服务端创建连接
            Socket socket = new Socket("127.0.0.1",8686);
            //获取socket输出流包装成打印流
            OutputStream os = socket.getOutputStream();
            PrintStream ps = new PrintStream(os);
            //利用循环不断的发消息给服务端    
            Scanner sc = new Scanner(System.in);
            while (true){
                System.out.print("请输入发送内如:");
               String msg = sc.nextLine();
               ps.println(msg);
               ps.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结果

创建多个客户端向服务端发送请求,服务端都成功将其打印
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch搭建基于图神经网络(GCN)的天气推荐系统(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 一、背景 极端天气情况一直困扰着人们的工作和生活。部分企业或者工种对极端天气的要求不同,但是目前主流的天气推荐系统是直接将天气信息推送给全部用户。这意味着重要的天气信息在用户手上得不到筛选,…

(C语言)背答案

[#4练习赛]背答案 题目描述 传智专修学院“Java程序设计”的期末考试来源于一个选择库,共有 nnn 道题目,每道题目由问题和答案组成,都是一个字符串,保证所有题目题面互不相同。这个题库已经发给同学进行备考准备。 正式考试中&…

Labview+STM32无线温湿度采集

一.介绍 该项目采用正点原子的STM32ZET6精英板DHT11温湿度模块泽耀科技的无线串口作为下位机,Labview无线串口作为上位机读取下位机发来的数据并处理。 泽耀科技的产品是我在开发过程中经常用到的,他们不仅产品做的非常不错,而且资料齐全售后…

远离cmd,拥抱powershell

简介:cmd命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。在不同的操作系统环境下,命令提示符各不相同。 在windows环境下,命令行程序为cmd.exe,是一个32位的命令行程序,微软Windows系统基于W…

动态规划--区间dp

区间dp题目列表:(1)石子合并(2)环形石子合并(3)能量项链(4)加分二叉树(5)凸多边形的划分(6)棋盘分割题目列表: (1)石子合并 在复习石子合并之前,为了直接进入专题“区间dp“,做一个区间dp的基础题,这个题目具有代表性…

1.2 Android 5.0 的特点

和其他版本相比, Android 5.0 的突出特性如下所示。 (1)全新的 Material 界面设计 Android 5.0 Lollipop 界面设计的灵感来源于自然、 物理学 以及基于打印效果的粗体、图标化的设计,换句话说,它的设 计是一种基于高品…

智慧建筑BIM解决方案-最新全套文件

智慧建筑BIM解决方案-最新全套文件一、建设背景为什么要发展智慧建筑二、思路架构三、建设方案智慧建筑建设时应考虑下面3个方面:1、减少耗能,促进资源利用效率2、优化工作和生活环境3、确保运营安全可靠四、获取 - 智慧建筑BIM全套最新解决方案合集一、…

m超外差单边带接收机的simulink仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 超外差是利用本地产生的振荡波与输入信号混频,将输入信号频率变换为某个预先确定的频率的方法。这种方法是为了适应远程通信对高频率、弱信号接收的需要,在外差原…

基于springboot在线玩具商城交易平台的设计与实现

随着科技创新不断突破玩具界限,特别是随着智能时代到来,电子游戏的兴起对传统玩具行业带来了冲击,智能玩具应运而生,成为新产品方向。智能玩具受消费者青睐, 随着电子商务的发展,其在我国的经济地位越来越…

spring boot酒店会员点餐系统毕业设计源码072005

Springboot酒店会员点餐系统 摘 要 进入21世纪以来,计算机有了迅速的发展。计算机应用、信息技术全面渗透到了人类社会的各个方面,信息化已成为世界经济和社会发展的大趋势。―企业的管理也从人工操作变得更加自动化、智能化和高效化。如果复杂的工作光靠…

PMP大家都是怎么备考的?使用什么工具可以分享一下吗?

这里分享PMP理论中的4个工具,在人生管理和项目管理中是通用的。所有的工具,只有在对的时间,用在对的地方,才能真正指导实践。 项目经理应符合PMI人才三角。分别为:技术项目管理;领导力;战略和…

腾讯云服务器后台重装后需要配置的一些东西

1、adduser 用户名(创建普通用户) 2、passwd 用户名(给普通用户设置密码) 3、userdel -r 用户名(删除普通用户) 4、修改/etc/sudoers文件(给普通用户可以提权的机会) 5、sudo yum in…

Hive——Hive常用内置函数总结

✅作者简介:最近接触到大数据方向的程序员,刚入行的小白一枚 🍊作者博客主页:皮皮皮皮皮皮皮卡乒的博客 🍋当前专栏:Hive学习进阶之旅 🍒研究方向:大数据方向,数据汇聚&a…

vdsm:添加接口调试demo

目录 添加API接口 2.添加api方法 3.Vdsm-api.yml添加参数 暴露jsonrpc接口: 需要重启vdsmd vdsm-client 调试 本文通过添加一个配置ovs全局参数的接口 添加API接口 文件路径:API.py 2.添加api方法 文件路径:network/api.py 3.Vdsm-ap…

4.2——Node.js的npm和包

目录初识node.jsnode.js的安装和查看版本使用node命令对js文件运行窗口的快捷键fs 文件系统模块fs.readFile() 方法写入文件fs.writeFile()案例——考试成绩整理路径问题path 路径模块路径拼接path.join()获取路径中的文件名path.basename()获取路径中的文件扩展名path.extname…

用Python的Django框架来制作一个RSS阅读器

Django带来了一个高级的聚合生成框架,它使得创建RSS和Atom feeds变得非常容易。 什么是RSS? 什么是Atom? RSS和Atom都是基于XML的格式,你可以用它来提供有关你站点内容的自动更新的feed。 了解更多关于RSS的可以访问 http://www…

[附源码]SSM计算机毕业设计足球队管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]java毕业设计企业记账系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

QT 发布文章遇到问题解决方案

提供了两种可以发布 Qt 程序的方案,建议使用第二种直接生成对应的文件,直接打包就可以 1. 手动复制需要的文件到运行目录下 我们写完 QT 程序当然是要发布或者发给其他需要用到的人,由于找不到Qt6Core.dll,无法继续执行代码,打开 realease …

Python基础语法

一、字面量:在代码中,被写下来的固定的值 二、注释 /增加代码的可读性 单行注释 #空格注释文字内容 (加空格只是规范)#右边 多行注释 一对三个双引号 """注释内容""" 三、变量 -->程序运行时…