前言
学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比如最近在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)
原文地址:Building a Java chart server[1]
项目源码:Socket_Chat
目录
- [Java聊天室服务器]实战之七 客户端类(未完成)
- [Java聊天室服务器]实战之七 读写循环(客户端)(未完成)
正文
移除死连接
线程类的第二个地方引用的是主要靠近底部的服务端对象,那里我们去除已经关闭的连接。更准确的说,我们每一个线程类,一旦连接关闭,必须请求服务端移除,以便我们可以处理它。下面是代码:
// 因某种原因,连接会关闭,所以服务端会处理它 server.removeConnection(socket);每次连接关闭的时候通知服务端是很重要的,这样服务端可以从任何内部清单上移除连接,也不会浪费时间给不在连接的客户端发送消息。
—————————————————————————————————————————————————————————————————————————
清理的重要性
移除死连接这一步,鉴于它在是们七大功能点的指导位置,它是决定性的,因为人们第一次写服务单的时候都会经常忘记它。
如果程序员忘记这一步,他们会发现服务端一段时间内工作很正常。之后变得越来越慢,开始占用越来越多的内存。当看到服务的输出时,他们才看到以惊人的速度出现的异常。
发生的是围绕所有连接的服务端都已关闭,尝试着发送消息给自己,发现根本做不到。
让我们继续说你的服务端接受连接,平均上说,每5s一次。让我们更大的假设大约15分钟内平均的用户。
这就意味着平均上,你会得到180个用户,在任意的时刻。当时光流逝,许多用户会连接或者关闭连接,仍然平均会保持在180个。
24小时过后,17280个用户会连接你的服务器。在一天的最后,你仍然有180个活的连接,你会有大约17100个死掉的连接。如果你不关心移除掉死连接,那么你的服务端试着花费大部分的时间把失败写入这些连接中。(实际上,大部分时间可能会抛出异常给System.out!)
正是由于这个原因,这些死掉的连接被清除掉才是至关重要的。
—————————————————————————————————————————————————————————————————————————
结束语
在下一节中我们会提到客户端方面的知识。
参考文献
[2]. Java sockets 101以及中文系列 JAVA套接字(Socket)101
[3]. Java socket通信基本原理介绍