java socket 线程池_java socket编程(多任务处理,线程池)

news/2024/7/5 2:09:38

与为每个连接创建一个新的线程不同,服务器在启动时创建一个由固定数量线程组成的线程池(thread pool),

当一个新的客户端连接请求传入服务器,它将交给线程池中的一个线程处理。当该线程处理完这个客户端后,又返回线程池,并为下一次请求处理好准备。如果连接请求到达服务器时,线程池中的所有线程都已经被占用,它们则在一个队列中等待,直到有空闲的线程可用。

服务器的简单示例代码如下

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.logging.Level;

import java.util.logging.Logger;

public class TCPEchoServerPool {

public static void main(String[] args) throws IOException {

if(args.length != 2){

throw new IllegalArgumentException("Parameter(s): ");

}

int echoServPort = Integer.parseInt(args[0]);

int threadPoolSize = Integer.parseInt(args[1]);

final ServerSocket servSock = new ServerSocket(echoServPort);

final Logger logger = Logger.getLogger("practical");

for (int i = 0; i < threadPoolSize; i++){

Thread thread= new Thread() {

public void run() {

while(true) {

try {

Socket clntSock = servSock.accept();

EchoProtocol.handleEchoClient(clntSock, logger);

}catch (IOException ex){

logger.log(Level.WARNING, "Client accept failed", ex);

}

}

}

};

thread.start();

logger.info("Created and started Thread = " + thread.getName());

}

}

}

运行后,设置有2个线程

E:\socket>java TCPEchoServerPool 9080 2

2012-4-13 0:12:12 TCPEchoServerPool main

信息: Created and started Thread = Thread-1

2012-4-13 0:12:12 TCPEchoServerPool main

信息: Created and started Thread = Thread-2

然后使用3个客户端连接,客户端加个sleep()语句,保持一段时间的连接不关闭socket,那么前两个客户端可以正常连接服务器,第三个客户端只能阻塞,前2个释放后就可以连接了。客户端程序如下

import java.net.Socket;

import java.net.SocketException;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

public class TCPEchoClient2{

public static void main(String[] args) throws IOException{

if((args.length < 2) || (args.length > 3))

throw new IllegalArgumentException("Parameter(s): [Port]");

String server = args[0];

byte[] data = args[1].getBytes();

int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;

Socket socket = new Socket(server,servPort);

System.out.println("Connected to server ... sending echo string");

InputStream in = socket.getInputStream();

OutputStream ut = socket.getOutputStream();

out.write(data);

int totalBytesRcvd = 0;

int bytesRcvd;

while(totalBytesRcvd < data.length) {

if((bytesRcvd = in.read(data, totalBytesRcvd,data.length - totalBytesRcvd)) == -1)

throw new SocketException("Connection closed premaurely");

totalBytesRcvd += bytesRcvd;

}

System.out.println("Received: " + new String(data));

try{

Thread.sleep(20000);

}catch(InterruptedException  e){

}

socket.close();

}

}

运行方式

java TCPEchoClient2 192.168.1.100 test3 9080


http://www.niftyadmin.cn/n/4388307.html

相关文章

Fibonacci numbers

Program for Fibonacci numbers The Fibonacci numbers are the numbers in the following integer sequence. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 141, …….. In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation Fn…

HTML DOM详细知识

1&#xff1a;节点 HTML DOM中&#xff0c;所有的事物都是节点。 整个文档是一个文档节点&#xff1b; 每个HTML元素是一个元素节点&#xff1b; 每个元素内的文本是一个文本节点&#xff1b; 每个属性是一个属性节点&#xff1b; 每个注释是一个注释节点&#xff1b; 2&#x…

PCI简介(二)

2019独角兽企业重金招聘Python工程师标准>>> 1.x86处理器系统地址空间简介 1.1 CPU地址空间 CPU地址空间是指CPU所能寻址的空间大小&#xff0c;比如对于32位CPU来说&#xff0c;其所能寻址的空间大小为0~4G。这是由CPU自身的地址总线数目决定的。这段空间也被称作C…

数组总结,持续更新~

数组的基础方法&#xff0c;就不一一介绍了&#xff0c;这里会介绍一些常用的ES6的一些常用方法&#xff0c; 在这之前&#xff0c;先说一些数组的常见问题。 1 数组的构建 数组的普通调用&#xff0c;等于构造调用。 下面的3种方式&#xff0c;都是一样的。 let arr Array(1,…

小程序中form 表单提交和取值方法

我们直接给 input 添加 bindinput,比如:<input bindinput="onUsernameInput" />,可以在 onUsernameInput 中直接使用 e.detail.value,即: onUsernameInput : function(e) { e.detail.value; } 但是,如果有多个输入控件,我们不可能为每个控件添加 bind…

java dateformat 24_java – (简单)DateFormat,允许24:00:00和00:00:00作为输入

值24:00未在LocalTime中表示,因为它严格地是第二天的一部分.考虑到24:00可以表示为LocalTime的一部分的模型,但结论是它在很多用例中会非常混乱,并且会产生比它解决的更多错误.但是在java.time中支持24:00.完全可以使用标准格式化技术对其进行解析,但是必须使用SMART或LENIENT模…

python使用yaml库读取和写入数据

import yamltest.yml文件数据&#xff1a;yaml_path r"D:\PycharmProjects\2020study\BBBstudy\test.yml" with open(yaml_path, r) as f:cfg f.read()print(cfg)# 此时读出来的数据是字符串print(type(cfg))# 用yaml.load方法转字典d yaml.load(cfg)print(d)prin…

lambda函数复习

def test(x):return x*x # 这里我们用lambda定义一个匿名的内联函数。请注意&#xff0c;该函数没有名称。test 是保存创建的lambda函数的变量的名称 # 上面的函数和下面的lambda函数是一样的 test_f lambda x: x*x print(test(3)) print(test_f(3)) # 常量函数 def constant(…