ncat 有个允许多客户端连接的参数,默认是100,我用线程池实现了类似的功能。
创建服务器线程池大小为100,可以同时处理100个连接,第100个往后的客户端需要等待前100个客户端有退出,它才能连上。
Server.java

import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {static ExecutorService executorService;static ServerSocket serverSocket;static Socket socket;static SocketAddress socketAddress;public static void main(String[] args) throws IOException {socketAddress = new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 6000);serverSocket = new ServerSocket();serverSocket.bind(socketAddress);executorService = Executors.newFixedThreadPool(100);// 监听线程new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {socket = serverSocket.accept();System.out.println(socket.getRemoteSocketAddress().toString());Thread clientThread = new ClientThread(socket);executorService.execute(clientThread);}} catch (IOException e) {e.printStackTrace();}}}).start();}
}class ClientThread extends Thread {static int num = 0;Socket socket;public ClientThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));String s = "你是第 " + (++num) + " 个客户端\n";out.write((s.getBytes()));out.flush();byte[] buffer = new byte[1024];while ((in.read(buffer)) != -1) {System.out.println(new String(buffer));}} catch (IOException e) {e.printStackTrace();}}
}

Client.java

import java.io.*;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {static ExecutorService executorService;static ServerSocket serverSocket;static Socket socket;static SocketAddress socketAddress;public static void main(String[] args) throws IOException {socketAddress = new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 6000);serverSocket = new ServerSocket();serverSocket.bind(socketAddress);executorService = Executors.newFixedThreadPool(100);// 监听线程new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {socket = serverSocket.accept();System.out.println(socket.getRemoteSocketAddress().toString());Thread clientThread = new ClientThread(socket);executorService.execute(clientThread);}} catch (IOException e) {e.printStackTrace();}}}).start();}
}class ClientThread extends Thread {static int num = 0;Socket socket;public ClientThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));String s = "你是第 " + (++num) + " 个客户端\n";out.write((s.getBytes()));out.flush();byte[] buffer = new byte[1024];while ((in.read(buffer)) != -1) {System.out.println(new String(buffer));}} catch (IOException e) {e.printStackTrace();}}
}

java 服务器线程池测试相关推荐

  1. java中线程池的几种实现方式

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  2. 自定义java线程池_我的Java自定义线程池执行器

    自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...

  3. 我的Java自定义线程池执行器

    ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...

  4. java 线程池 复用机制,java的线程池框架及线程池的原理

    java 线程池详解 什么是线程池? 提供一组线程资源用来复用线程资源的一个池子 为什么要用线程池? 线程的资源是有限的,当处理一组业务的时候,我们需要不断的创建和销毁线程,大多数情况下,我们需要反复 ...

  5. [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍

    1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...

  6. Java创建线程池的方式

    Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...

  7. Java 自定义线程池

    Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...

  8. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  9. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

最新文章

  1. ASP.NET中使用MD5和SHA1算法加密
  2. ASP.NET跨页面传值(二)
  3. jsp页面提示“Multiple annotations found at this line: - The superclass javax.servlet.http.HttpServlet w
  4. Tomcat 启动提示未发现 APR 的解决方法
  5. 【目标检测】ATSS: bridging the gap between anchor-based and anchor-free detection via ATSS (cvpr20)
  6. 前端页面通过web3.eth.accounts无法获取账户信息
  7. 《HTML5+CSS3网页设计入门必读》——第1章 标记简史1.1 从IETF到W3C:HTML 4的诞生过程...
  8. 互联网行业不需要中年人,那些35岁离开BAT的人都去哪了?
  9. 运行时 不显示对话框 只显示 对话框上面的控件
  10. Base64编码(java)
  11. 谷雨,微信公众号图文排版必备素材集锦
  12. bitbucket 代码备份
  13. 绕过SSL双向校验抓取Soul App的数据包
  14. Java通过substring截取指定字符
  15. NLP学习(十)-情感分析技术及案例实现-Python3实现
  16. 【人工智能】人工智能顶级研究所+人工智能顶级研究机构+人工智能顶级大学推荐!
  17. 常用元器件封装的命名规范-001
  18. 创造鲜活的三维数字城市
  19. android 画空心矩形框,Android实现空心圆角矩形按钮的实例代码
  20. 智能手机android下的记步器的实现

热门文章

  1. es6箭头函数_ES6语法之-箭头函数
  2. ad软件 pcb如何走线过孔_【经验】关于高速PCB设计的一些经典问答
  3. Docker:Docker的简介、安装、使用方法之详细攻略
  4. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
  5. ML:分类预测问题中评价指标(ER/混淆矩阵P-R-F1/ROC-AUC/RP/mAP)简介、使用方法、代码实现、案例应用之详细攻略
  6. AdaBoost算法特性
  7. 机器学习-特征工程中的特征选择
  8. C语言实现常用数据结构——堆
  9. UVa 11971 - Polygon(几何概型 + 问题转换)
  10. 那些永不消逝的进程 (转)