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

Java Socket编程中处理长连接的方法

2016-06-26 11:13 190 查看
因为实习可能要用Java,所以学习了一下Java,正好计算机网络实验要写一个Web服务器,可以用来练练手。

实现Web服务器时,最基本的流程就是当有客户端连接服务器时,把连接交给一个线程,由这个线程来处理这个连接。处理的流程也很简单,就是读取一个请求,然后返回响应。

我第一步准备实现服务器读取完客户端的请求后,再将这些请求返回给客户端,用来测试我前期的工作,然后再进行下一步。因为在这一步我没有想要解析请求,因此我实现的方法是将请求直接以InputStreamReader()的方法按byte进行读取,读取完毕后再将读取的内容写回Socket。

但是测试的时候发现了问题,浏览器访问服务器的时候,一直处在等待服务器响应的状态。在源码中加了几个print以后发现,线程总是阻塞到了读Socket的位置。这时我意识到了,服务器读取了客户端的请求后,客户端并没有关闭这个Socket,因此发生了阻塞。客户端之所以没有关闭Socket,是因为现在HTTP默认使用keep-alive连接,也就是长连接,这是用来减轻服务器负担的一种方法。

网上一开始找到的方法是给Socket连接使用setSoTimeout()方法设置一个超时值,这样的话服务器会主动关闭这个连接,也就是说服务器只会被阻塞一个有限的时间值。但我觉得这种方法并不好,因为网络状况不好的时候,你很难保证服务器在这个时间值内会接收完请求。而且服务器主动关闭这个连接后,客户端再次发请求时就要产生一个新的连接,加重了服务器的负担。

因此我采用了第二种方法,就是使用BufferedReader。这样一来,我就不再以byte为单位从Socket中进行读取了,而是以行为单位从Buffer中进行读取。这样的话,当读取到CRLF,也就是一个空行时,客户端的一个请求就接收完毕了,就可以开始处理了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket java web服务器