1 代码
import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 传统socket服务端-多线程 */ public class OioServer2 { @SuppressWarnings("resource") public static void main(String[] args) throws Exception { ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); // 创建socket服务,监听10101端口 ServerSocket server = new ServerSocket(10101); System.out.println("服务器启动!"); while (true) { // 获取一个套接字【阻塞】 final Socket socket = server.accept(); System.out.println("一个新客户端连接!"); newCachedThreadPool.execute(new Runnable() { public void run() { // 异步业务处理。客户端1执行至此,不阻塞。server可以接收客户端2的连接 handler(socket); } }); } } /** * 读取数据 */ public static void handler(Socket socket) { try { byte[] bytes = new byte[1024]; InputStream inputStream = socket.getInputStream(); while (true) { // 读取数据【阻塞】 int read = inputStream.read(bytes); if (read != -1) { System.out.println(new String(bytes, 0, read)); } else { break; } } } catch (Exception e) { e.printStackTrace(); } finally { try { System.out.println("socket关闭"); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
2 测试流程
原阻塞代码accept和read不变,但客户端1执行异步业务处理,不阻塞,server可以接收客户端2的连接。这种模式为一个客户端一个线程,会导致线程数过多。相当于一个饭店,经理在门口迎接客人(accept),相当于为每个客户(socket)安排一个服务员(线程)。
时间: 2024-09-14 23:35:53