您的位置:首页 > 编程语言 > Java开发

[Java聊天室服务器]实战之六 去除死链接

2014-05-12 22:53 246 查看

前言

学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境

:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比如最近在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

原文地址:Building a Java chart server[1]

项目源码:Socket_Chat

目录

[Java聊天室服务器]实战之一 开篇介绍(已完成)

[Java聊天室服务器]实战之二 监听类(已完成)

[Java聊天室服务器]实战之三 接收循环(已完成)

[Java聊天室服务器]实战之四 线程类(已完成)

[Java聊天室服务器]实战之五 读写循环(服务端)(已完成)

[Java聊天室服务器]实战之六 去除死链接(已完成)

[Java聊天室服务器]实战之七 客户端类(已完成)

[Java聊天室服务器]实战之八 读写循环(客户端)(已完成)

正文

移除死连接

线程类的第二个地方引用的是主要靠近底部的服务端对象,那里我们去除已经关闭的连接。更准确的说,我们每一个线程类,一旦连接关闭,必须请求服务端移除,以便我们可以处理它。下面是代码:

// 因某种原因,连接会关闭,所以服务端会处理它
			server.removeConnection(socket);
每次连接关闭的时候通知服务端是很重要的,这样服务端可以从任何内部清单上移除连接,也不会浪费时间给不在连接的客户端发送消息。

—————————————————————————————————————————————————————————————————————————

清理的重要性

移除死连接这一步,鉴于它在是们七大功能点的指导位置,它是决定性的,因为人们第一次写服务单的时候都会经常忘记它。

如果程序员忘记这一步,他们会发现服务端一段时间内工作很正常。之后变得越来越慢,开始占用越来越多的内存。当看到服务的输出时,他们才看到以惊人的速度出现的异常。

发生的是围绕所有连接的服务端都已关闭,尝试着发送消息给自己,发现根本做不到。

让我们继续说你的服务端接受连接,平均上说,每5s一次。让我们更大的假设大约15分钟内平均的用户。

这就意味着平均上,你会得到180个用户,在任意的时刻。当时光流逝,许多用户会连接或者关闭连接,仍然平均会保持在180个。

24小时过后,17280个用户会连接你的服务器。在一天的最后,你仍然有180个活的连接,你会有大约17100个死掉的连接。如果你不关心移除掉死连接,那么你的服务端试着花费大部分的时间把失败写入这些连接中。(实际上,大部分时间可能会抛出异常给System.out!)

正是由于这个原因,这些死掉的连接被清除掉才是至关重要的。

—————————————————————————————————————————————————————————————————————————

结束语

在下一节中我们会提到客户端方面的知识。

参考文献

[1]. Building a Java chart server

[2]. Java sockets 101以及中文系列 J***A套接字(Socket)101

[3]. Java socket通信基本原理介绍
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: