ServerSocket 和 ThreadPoolExecutor学习笔记

ServerSocket部分123456789101112final ServerSocket server = new ServerSocket(9090);server.setReceiveBufferSize(1024 * 4);// 设置缓冲区大小4kdo { try { final Socket client = server.accept(); soaTransPool.execute(new SoaTransPool.SoaCodecTask(client)); } catch (IOException e) { //TODO e.printStackTrace(); }} while (true); 其中,soaTransPool是一个自定义的类,类中定义了ThreadPoolExecutor,以及实现了Runnable的静态类SoaCodecTask. ServerSocket监听9090端口,每当有请求到达,就创建一个socket,使用这个socket构造一个Runnable对象,即SoaCodecTask,再使用ThreadPoolExecutor来执行这个Runnable对象。也就是说,对每个请求创建一个任务,由线程池来执行这个任务。 事实上,ServerSocket的功能就是向系统注册一个服务,然后等待客户端请求,或者从请求队列中取出Socket,至于数据的传递则由Socket完成。 上面的例子中,使用的是线程池的处理方式,接收到的请求由线程池来处理;如果是简单的单线程ServerSocket,则可以这么写: 1234567891011121314151617ServerSocket server = new ServerSocket(9090);Socket client = null;do { try { client = server.accept(); System.out.println("新增链接: " + client.getInetAddress() + ": " + client.getPort()); // ...接收、处理、发送数据 } catch (IOException e) { //TODO e.printStackTrace(); }finally{ if(client != null){ client.close(); } }} while (true); 如果是想用多线程,就如第一个例子中那样,将socket作为参数创建一个Runnable对象,并新建一个线程并start以执行run方法。

发布于 technology