TCP实现服务器与客户端的连接(多线程)

2023-05-16

上一篇博客中,我们用TCP实现了服务器与客户端的连接。但是有一个问题,即一个客户端在和服务器交互时,其他客户端无法连接,为解决这一问题,我们将服务器端改造为线程池的版本。

(1)在主线程中服务器只负责接待客户端的请求。接收到客户端的请求后,我们把请求提交至线程池是工作队列中。

public static void main(String[] args) throws IOException {
    //创建线程池,大小为10
	ExecutorService pool = Executors.newFixedThreadPool (10);
    //服务器起一个端口
    ServerSocket serverSocket = new ServerSocket (8080);
    while(true){
        Socket socket = serverSocket.accept ();//接收客户端请求,返回一个socket供通信
        pool.execute (new ServerTask(socket));//把任务提交至线程池
    }

}

(2)Executors类 的 newFixedThreadPool() 方法,返回一个 ExecutorService 的线程池

  • public static ExecutorService newFixedThreadPool( int nThreads )
  • 创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。
  • 在任何时候,最多nThreads线程将处于主动处理任务。 如果所有线程处于活动状态时都会提交其他任务,则它们将等待队列中直到线程可用。
  • 如果任何线程由于在关闭之前的执行期间发生故障而终止,则如果需要执行后续任务,则新线程将占用它。

(3)将任务提交至线程池之后,线程池则主动处理任务。
(4)ServerTask 为一个用户自定义类,用来处理任务。

private static class ServerTask implements Runnable{
    private Socket socket;

    ServerTask(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
        	InetAddress clientAddress = socket.getInetAddress ();
            int clientPort = socket.getPort();

            System.out.printf ("有客户端连接上来:%s%d%n",clientAddress,clientPort);

            //获取输入字节流(即客户端发送来的消息)
            InputStream is = socket.getInputStream ();
            //字节流转换为字符流
            InputStreamReader isReader = new InputStreamReader (is);
            //字符流转换为缓冲字符流
            BufferedReader reader = new BufferedReader (isReader);

            //输出字符流
            OutputStream os = socket.getOutputStream ();
            PrintStream out = new PrintStream (os,true,"UTF-8");


            while(true){
                String line;
                while(!(line = reader.readLine ()).isEmpty ()){
                    System.out.println ("收到消息:" + line);
                    Scanner sc = new Scanner (System.in);
                    System.out.print ("请回复:");
                    String response = sc.nextLine ();
                    out.println (response);
                }
            }

        } catch (IOException e) {
            e.printStackTrace ();
        }

    }
}

完整程序:
https://github.com/WangWenQian12/Java_Practice/tree/master/JavaSE/IDEA/JavaWeb/TCP2/src

这样我们就实现了多个客户端连接一台服务器的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP实现服务器与客户端的连接(多线程) 的相关文章

  • Java集合学习

    Java集合图的详解 Java集合详解 第一部分 Collection xff08 继承了Iteratable接口 xff09 和Map xff0c 是集合框架的根接口集合类存放于java util包中 集合类存放的都是对象的引用 xff0
  • yaml文件格式总结

    yaml文件格式总结 概念基本语法数据类型YAML 对象 YAML 数组复合结构纯量引用 概念 YAML 是 YAML Ain t a Markup Language xff08 YAML 不是一种标记语言 xff09 的递归缩写 在开发的
  • tmux使用教程

    tmux 的安装 Centos系统中使用 yum 来安装 tmuxyum install tmuxUbuntu系统使用apt安装tmuxapt install tmuxMac OS 使用 brew 来安装 tmuxbrew install
  • SSM-Spring快速入门(基于maven)

    Spring IoC amp DI 开发流程 xff08 1 xff09 导入Spring开发的基本包坐标 span class token generics span class token punctuation lt span pro
  • RocketMQ发送事务消息的所有方法以及代码示例

    TOC 一 使用RocketMQTemplate发送事务消息 首先我们要确定发送什么样的消息 xff0c 使用RocketMQTemplate发事务消息时程序会自动进入事务监听器类中 xff0c 所以我们确定发什么样的消息才能在事务监听器中
  • ubuntu运行maude提示error while loading shared libraries: libtinfo.so.5

    ubuntu运行maude提示 maude linux64 error while loading shared libraries libtinfo so 5 cannot open shared object file No such
  • connect to host port 22: Connection refused

    Windows 使用SSH连接树莓派 xff1a 提示 xff1a 这里简述项目相关背景 xff1a 今天练习发现使用MobaXterm可以正常连接到树莓派 xff0c 但是使用windows终端就不可以连接 xff0c 显示connect
  • windows通过SSH控制树莓派

    windows通过SSH控制树莓派 xff1a 因学习需要在windows系统下对树莓派进行SSH连接 xff0c 包括SSH密钥生成 密钥传输及公钥保存等 Windows下密钥的产生 在Windows下使用 ssh keygen生成公钥和
  • raspistill command not found

    raspistill command not found xff1a 提示 xff1a 这里简述项目相关背景 xff1a 今天使用树莓派来调用摄像头 xff0c 摄像头为树莓派官方摄像头 xff0c 在升级系统和配置后发现使用raspist
  • 树莓派I2C基本用法

    文章目录 一 I2C二 I2C配置1 I2C02 I2C13 I2C34 I2C45 I2C56 I2C6 三 I2C工具总结 一 I2C 树莓派默认打开I2C功能 xff0c 如果I2C没有打开 xff0c 可以使用命令sudo rasp
  • 树莓派RTC

    文章目录 一 RTC准备二 RTC芯片三 为什么使用hwclock显示找不到硬件总结 一 RTC准备 在使能树莓派RTC之前 xff0c 需要先为树莓派RTC模块安装电池 xff08 一般为纽扣电池 xff09 二 RTC芯片 树莓派4B使
  • cpptools占用率过高

    问题描述 使用vscode发现在系统中cpptools CPU占用率达到百分百 电脑发生严重卡顿 解决方案 xff1a 此问题的出现是因为使用了C C 43 43 这个插件 xff0c 如果直接禁用此插件就可以解决这个问题 如果希望使用这个
  • c语言状态机系统

    读取文件并实现了把里面的数字读取出来并加以求平均数 include lt stdio h gt include lt string h gt using namespace std int a1 1000009 int r 61 0 int
  • 快速创建kvm虚拟机(shell)

    通过脚本的方式 xff0c 快速复制kvm虚拟机 更改脚本变量 使用脚本 结果展示 脚本如下 xff0c 已测试通过 usr bin env bash coding utf 8
  • windows安装虚拟机 Linux-ubuntu20.04.6 LTS x86_64(Py3.7.9)详细教程

    安装虚拟机 首先需要下载vmware 注意版本 xff0c 这里我下载的版本是 vmware最新版 xff08 17 0 0 build 20800274 xff09 17 0 0 build 20800274版本的密钥 xff1a MC6
  • 基于51单片机实现时间显示及闹钟设置

    文章目录 一 介绍二 原理三 步骤四 结果五 结果分析六 总结 一 介绍 本次为大学中的一次创新实验 xff0c 当时老师叫我自己拿个单片机去玩 xff0c 为了赶时间就做了个简单的时间显示和闹钟设置 xff0c 因为比较简单所以也把代码附
  • vim 文本替换

    常规替换 n1 span class token punctuation span n2s hello world g span class token operator span 用world替换文件n1行到n2行所有的hello n1
  • 51单片机定时器工作方式1、2原理详解

    写在前面 1 本篇博文旨在帮助那些像我一样刚入门51单片机 xff0c 如果你对定时器有一定了解 xff0c 但是其中的的工作方式不能理解 xff0c 那么这篇文章很适合你 xff0c 如果你是大神的话 直接绕行吧 2 我在学习的过程中由于
  • 虚拟机Ubuntu连接不了网络的解决方法

    昨晚上虚拟机ubuntu中网络还是正常使用的今天准备安装一个nfs服务发现无法使用apt工具了 xff0c 然后才发现虚拟机没网了 xff0c 然后在百度试了两种方法没有效果 方法1 xff1a 尝试输入以下命令来解决 xff1a span
  • 安装Anaconda并配置环境变量

    安装Anaconda并配置环境变量 下载安装配置变量 下载安装 anaconda官网 xff1a https www anaconda com 选择需要的版本进行下载 https www anaconda com products dist

随机推荐

  • OrCAD 导出 BOM 表

    BOM 表简介 BOM表是什么呢 xff1f 它的全称 xff08 Bill Of Material xff09 即物料清单的意思 顾名思义 xff0c 一个产品的BOM说明了这个产品总共需要多少零配件来组装 所有的PCBA制造商都需要根据
  • Allergo 导出光绘(Gerber)文件及坐标文件

    文章目录 导出 Gerber光绘介绍设置输出文件夹和路径生成钻孔信息导出光绘 ArcworkGerber 生成报错 database has error 导出坐标文件坐标文件介绍生成坐标文件 参考资料 导出 Gerber 光绘介绍 Gerb
  • cpp-http 库的使用

    文章目录 前言 96 cpp http 96 库简介 96 cpp http 96 库使用介绍http 客户端搭建步骤http 服务端搭建步骤 96 cpp http 96 库示例服务端实现客户端实现 示例下载关于示例代码编译出错的问题 参
  • esp32 开发环境搭建

    文章目录 前言提示构建工具安装 IDF设置 idf 目标平台 设定环境变量同时安装多个版本安装 idf 和 tools修改环境变量 参考资料ESP IDF 快速入门编译 ESP AT 工程idf py build 出现cmake faile
  • Latex之给字符上加横线、波浪线、^等

    加 号 xff1a hat x 加波浪线 xff1a widetilde x 加两个点 xff1a ddot x 以上几种对应结果 xff1a 如果是在正文中 xff1a 要在左右带上 公式添加 xff1a overline X 61 fr
  • linux操作系统远程登录拷贝

    1 SSH远程登录 xff1a 命令格式 xff1a ssh 用户名 64 IP地址 命令选项ssh远程登录scp远程拷贝 说明 SSH是专门为远程登录提供的一个协议 xff0c 常用于远程登录 xff0c 使用前需要安装相应的服务和客户端
  • VMware的Debian11如何删除磁盘文件,并在扩充原有磁盘

    删除原有磁盘分区 1 在 虚拟机 gt 设置 中 xff0c 选中需要删除的磁盘分区文件 xff0c 点击 移除 xff1b 2 如果此磁盘已设置开机自动挂载 xff0c 需要取消挂载 xff1a xff08 1 xff09 在 root
  • 计算机视觉思维导图

    计算机视觉思维导图 最近整理的计算机视觉思维导图分享给大家 xff0c 来源于各个教学视频以及博客 xff0c 可以当做字典使用 xff0c 知道整个行业的方向及相关技术 xff0c 按照自己理解的视觉处理任务顺序排序
  • centos8安装docker错误解决

    安装出现 Problem problem with installed package buildah Last metadata expiration check 0 08 17 ago on Sat 20 Feb 2021 12 43
  • c中输入一个十进制数,输出它的八进制二进制以及十六进制

    代码 xff1a span class token macro property span class token directive keyword include span span class token string lt stdi
  • 如何删除Alibaba PC Safe Service

    如何删除Alibaba PC Safe Service Alibaba PC Safe Service是AlibabaProtect服务项目 xff0c Alibaba PC Safe Service这个东西在任务管理器里你是如论如何都关不
  • Yapi-从零搭建接口管理平台

    介绍 旨在为开发 产品 测试人员提供更优雅的接口管理服务 可以帮助开发者轻松创建 发布 维护 API xff1b 官网网址 xff1a YApi 教程 hellosean1025 github io 搭建 其实官网有明确的搭建方法 xff0
  • Sql 数据库细节全解(icelei讲sql)

    磊哥哥讲Sql 一 what who defined1 数据库whatever2 引言导入 二 database and tables guy1 Basic element project definition2 template data
  • 编写一个Shell函数检查Linux系统中某文件的权限是否小于一个值

    我编写了一个Shell函数 xff0c 使用这个函数需要传两个参数 xff1a 文件绝对路径和一个三位整数 通过这个函数可以检查文件权限是否小于等于你给定的值 submod export filepath 61 1 export maxmo
  • codeforces 1328 B. K-th Beautiful String

    题意 xff1a 就是找到第 k k k 个全排列的字符串 通过找规律 xff0c 第一个 b b b 在倒数第二位有
  • 使用python 解ccf-csp 2019-03-1小中大

    传送 问题描述 问题分析 这个题目最大值和最小值很好得到 xff0c 因为已经排好序了 xff0c 只需要判断一下是正序还是反序就可以了 xff0c 至于中位数我们得先清除它的概念 xff0c 如果不清楚 xff0c 也可以从给出来的例子判
  • ubuntu生成anaconda快捷方式

    https blog csdn net weixin 45653050 article details 105636020
  • 编码转换

    编码定义 在计算机硬件中 xff0c 编码 xff08 coding xff09 是在一个主题或单元上为数据存储 xff0c 管理和分析的目的而转换信息为编码值 xff08 典型地如数字 xff09 的过程 在软件中 xff0c 编码意味着
  • Visual Studio Code安装go插件报错

    VScode第一次跑go代码时提示The go outline command is not available Run 34 go get v github com ramya r有效解决安装方法 出现问题 xff1a Visual St
  • TCP实现服务器与客户端的连接(多线程)

    上一篇博客中 xff0c 我们用TCP实现了服务器与客户端的连接 但是有一个问题 xff0c 即一个客户端在和服务器交互时 xff0c 其他客户端无法连接 xff0c 为解决这一问题 xff0c 我们将服务器端改造为线程池的版本 xff08