每日一学之socket编程(二)

图片来自与百度图片

为什么要引入线程

在实际的开发中,一个ServerSocket服务端最小都有几十上百个客户端进行访问。当数据处理不及时,就会造成连接阻塞。

不知道大家是否还记的昨天的最简单的服务端编码每日一学之socket编程(一),大家可以使用将此服务端运行起来,用多个客户端进行访问,

使用上述代码打印出访问的客户端的IP和端口。你就会发现,如果上一个客户端一直不关闭,后面的客户端就会一直阻塞在那里。这样的软件是相当不友好的。因此我们需要引入多线程的机制来解决这个问题。

产生阻塞的位置

通过下面两段代码,帮助大家认识多连接socket会发生阻塞的位置。

代码一

运行结果

代码二

运行结果

因此,阻塞后续socket进行连接的罪魁祸首是对输入输出流的处理。

解决方式

多线程解决多连接

是不是so easy,不过在这里一定要注意:ServerSocket永远只有一个哦,他就一个端口,一个端口只能够被绑定一次。

不知道大家有没有发现上面程序的缺点,那就是会无限的创建线程,这样服务器也压力山大啊,因此,此种方法是不可取的。不过没关系,办法总比困难多,暂不还有好朋友线程池(ThreadPool)嘛,让他来帮我们把线程管理起来。

线程池解决多连接

在Java中利用Executors来获取线程池,Executors提供了四种线程池供大家在不同场景下进行选择,这里以newCachedThreadPool为例,为大家讲述怎么利用线程池来解决实际情况下的多连接问题。

newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

运行结果

从结果可以看出,第三次连接使用了第二次创建的线程。

下期提要

下期将接触到Java中的NIO中非常重要的一部分知识Buffer!敬请期待!

源码下载地址:https://pan.baidu.com/s/1bMRFkU

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171209G04P2A00?refer=cp_1026

同媒体快讯

扫码关注云+社区