在上篇例子中,存在缺陷如果有一个客户端没有处理完,则后续会进入阻塞状态,也就是说同一个Server端,只能同时给Client端服务,这篇使用线程池完善上篇的例子
TCP服务端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
import java.util.logging.Logger;
/**
* TCP 服务双向连接线程池版本
* @version 1.0
* @author terry
* @date 2021/12/17
*/
public class TcpServer implements Runnable{
public static Logger logger = Logger.getGlobal();
private Socket socket;
TcpServer(Socket socket){
this.socket = socket;
}
public static void main(String[] args) throws IOException {
logger.info("服务开始监听。。。");
ServerSocket server = new ServerSocket(5002);
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
while (true) {
Socket accept = server.accept();
threadPoolExecutor.execute(new TcpServer(accept));
}
}
@Override
public void run() {
logger.info("客户端连接。。。");
try (DataInputStream input = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream())) {
String data = input.readUTF();
out.writeUTF(" hello client ! ");
logger.info("服务端接受的信息:" + data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP客户端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Logger;
/**
* TCP 客户端双向连接
* @version 1.0
* @author terry
* @date 2021/12/17
*/
public class TcpClient {
public static Logger logger = Logger.getGlobal();
public static void main(String[] args) throws IOException {
logger.info("客户端启动。。。");
Socket client = new Socket("localhost", 5002);
DataOutputStream out = new DataOutputStream(client.getOutputStream());
DataInputStream input = new DataInputStream(client.getInputStream());
out.writeUTF("hello server!");
out.flush();
// 这段会阻塞
String msg = input.readUTF();
logger.info("客户端接受消息:" + msg);
out.close();
input.close();
client.close();
}
}
启动顺序 先启动TCP服务端 后启动TCP客户端
TCP 服务端打印:
十二月 18, 2021 11:39:02 上午 com.terry.demo3.TcpServer main
信息: 服务开始监听。。。
十二月 18, 2021 11:39:09 上午 com.terry.demo3.TcpServer run
信息: 客户端连接。。。
十二月 18, 2021 11:39:09 上午 com.terry.demo3.TcpServer run
信息: 服务端接受的信息:hello server!
TCP 客户端打印:
十二月 18, 2021 11:39:09 上午 com.terry.demo3.TcpClient main
信息: 客户端启动。。。
十二月 18, 2021 11:39:09 上午 com.terry.demo3.TcpClient main
信息: 客户端接受消息: hello client !