每日一学之socket编程(二)

图片来自与百度图片

为什么要引入线程

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

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

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

产生阻塞的位置

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

代码一

运行结果

代码二

运行结果

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

解决方式

多线程解决多连接

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

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

线程池解决多连接

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

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

运行结果

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

下期提要

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

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

本文来自企鹅号 - 人人会编程媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏波涛汹涌

在CentOS 7上安装MongoDB

在这个MongoDB教程中,我们将解释如何在CentOS 7上安装数据库,然后提供一些基本特性和功能的简短指南。

3852
来自专栏Golang语言社区

Gogland更名为GoLand,并附加新功能

IDE改名 Jetbrains在2017年11月02日正式对外公布,Gogland IDE正式改名为GoLand。在社区之前的文章《你们使用的Go IDE要改名...

4179
来自专栏张善友的专栏

Windows安装和使用zookeeper

之前整理过一篇文章《zookeeper 分布式锁服务》,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http:...

2189
来自专栏运维咖啡吧

Django配置Celery执行异步任务和定时任务

celery是一个基于python开发的简单、灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线程上执行任务调度。采用典型的生产者-...

1502
来自专栏云计算与大数据

研发:Idea工具因为版本工具设置问题,导致全是红色

I have the current status of my files in the folders coloured red/brown. I tried...

973
来自专栏liulun

JSP+Servlet+mysql简单示例【图文教程】

下载MYSQL:http://dev.mysql.com/downloads/ ? 下载安装版的 ? 然后安装(安装步骤就不详细说了) 安装好之后,点击托盘图标...

28910
来自专栏后端技术探索

nginx+memcached构建页面缓存应用

nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、djang...

822
来自专栏前端儿

Node.js基于Express框架搭建一个简单的注册登录Web功能

这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb

1341
来自专栏小狼的世界

Linux中的Diff和Patch

本文主要记录两个命令的学习情况:diff 和 patch。diff 和 patch 是一对工具,使用这对工具可以获取更新文件与历史文件的差异,并将更新应用到历史...

1423
来自专栏散尽浮华

运维利器-ClusterShell集群管理操作记录

在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆...

3807

扫码关注云+社区