Socket连接超时(转)
Socket.connect连接超时有二种情况:
1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间。这在国外访问weibo时,并且网络环境极差的情况下有可能发生。
解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.
但是当调大之后,发现不到10s就报timeout exception。
通过国外的机器ping api.weibo.com发现unreachable。
说明客户端在传输层之下的网络层就发现连个Syn的报文都发不出去,更不用说三次握手了,客户端直接失败并抛timeout exception。
经验:在connection timeout诊断的第一步应该是ping一下确认网络层没有问题。
注:客户端设置了timeout,但并不会等到超时才返回异常。客户端只要第一时间发现连接失败,就会抛timeout exception。
2.如果timeout设置的时间足够,但是由于服务器端的处理能力较差,比如缓冲连接队列较小,而应用层的处理能力没有连接缓冲快,导致缓冲连接占满,而拒绝新的连接。
在服务端因为连接队列占满而拒绝服务的期间,客户端的通过TCP协议重试三次。每次的时间翻倍。
如果三次时间的累加<timeout参数值且能连接上,属于正常情况,表示队列腾出空位放当前连接。
如果三次时间的累加<timeout参数值且未能连接上,则客户端会立刻抛出timeout exception,而不等timeout到期才抛。
附:读写超时
1.读写超时
read超时设置有意义,在服务器处理能力差,但最终会响应的情况下,可以将客户端的等待响应时间设长一些。如果太长的话,由于客户端使用的是BIO的方式,线程会一直阻塞在IO而导致挂起。当客户端的处理能力明显快于服务端,这样挂起的线程会很多。
不管客户端还是服务器端,当有很多线程阻塞时,对机器的性能都会影响。我在weibo的论坛上看到有人在read timed out后,将soTimeout的时间设为100s。这是很危险的,新浪的服务器一旦崩溃,自己的服务器也会由于大量线程积压崩溃。
因为线程在挂起之后,它掌握的资源并不会释放,比如内存,直到阻塞完成。同时大量线程的挂起就意味着系统要做大量上下文的恢复并调度执行。
解决办法:
如果客户端使用NIO的方式,如果服务端的响应能标出客户端的请求,则线程在客户端请求之后,完全可以把请求放入一个BlockQueue,然后利用Future或Wait/Notify等机制在带着请求标志的响应返回的时候,唤想队列中的请求接着处理,从而实现异步处理,可以用少量线程服务大量请求。
同样,如果服务器端可以使用NIO做到请求每线程处理,而不是连接每线程,可以大大减少线程挂起导致资源的浪费,NIO适用于连接很多,请求很少的场合。另外,Commet又称为服务器推技术,它的主要特点是长连接。避免客户端低效的请求轮询。主要用于聊天室,WEIBO,因为连接多,请求不一定多,同样也适合在服务器端使用NIO
注:read timeout异常时,并不需要ping远程机器,因为它是辅助定位connection timeout,如果ping不通,肯定是conneciton timeout而不会到read timeout。read timeout exception不会导致连接中断。为重试提供了机会。
2.write超时一般不象connection timeout和read timeout可以在客户端显示调值,TCP有写重传的概念,一般8m内会重试,否则,直接断开连接。
Socket连接超时(转)的更多相关文章
- C# Socket连接超时设置
问题描述: 对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socke ...
- 关于TcpClient,Socket连接超时的几种处理方法
用TcpClient做通信的时候,经常发现网络连接不通的时候,代码就卡死在那里,TcpClient竟然没有超时的设定 泪奔啊 看来微软不是把所有工具准备得妥妥当当的啊 没办法 现在用线程来包装一下这个 ...
- 【c#】设置Socket连接、接收超时(转)
用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...
- [PHP]socket的连接超时 与 读取/写入超时
socket处理时有两种超时 , 分为连接超时 和 读取/写入数据超时 1. stream_socket_client 函数中的超时时间是连接超时 , 默认是php.ini中的default_sock ...
- 【c#】设置Socket连接、接收超时
用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...
- c# 创建socket连接辅助类-可指定超时时间
using AD.SocketForm.Model; using NLog; using System; using System.Net.Sockets; using System.Threadin ...
- FlashFXP出现“数据Socket错误,连接超时”解决方案
把FlashFXP选项中的"使用被动模式"的勾去掉就正常了. 或者在路由上映射服务端设定的被动模式所使用的所有端口,server-u就10个左右,微软的ftp是多少个,偶就不清楚了 ...
- 如何判断Socket连接失效
http://cuisuqiang.iteye.com/blog/1453632 ——————————————————————————————————————————————————————————— ...
- redis远程连接超时
今天在用jedis连接远程的redis时,抛出连接超时异常:connect timed out. 详细信息例如以下: Exception in thread "main" r ...
随机推荐
- TP 控制器扩展_initialize方法实现原理
参考网址:http://gongwen.sinaapp.com/article-59.html 控制器扩展接口 系统Action类提供了一个初始化方法_initialize接口,可以用于扩展需要,_i ...
- 使用windows-SQLyog连接linux-mysql
嘿嘿,最近又清闲了一点,重新安装了mysql去学习. -----博客园-邦邦酱好 系统环境: 1. 主机为windows系统,安装了SQLyog. 2. 主机上还安装了虚拟机,系统为c ...
- Error与Exception的区别
错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...
- 详解CMS垃圾回收机制
原创不易,未经允许,不得转载~~~ 什么是CMS? Concurrent Mark Sweep. 看名字就知道,CMS是一款并发.使用标记-清除算法的gc. CMS是针对老年代进行回收的GC. CMS ...
- ecshop模板 lbi文件
Ecshop根目录/ |->其它目录|->themes |->例:default (模板项目目录) |->images ...
- ecshop网站建设手机版wap版出现lib.debug.php on line 303
首先我们可以看到页面中提示\includes\lib.debug.php on line 303这样的错误,那么我们首先应该找到这个文件的低303行.代码是: $pa = &new Print ...
- JDBC连接数据库和释放连接
用久了hibernate现在对于JDBC是怎么实现数据库的连接和释放,所以特地总结下关于JDBC的知识,目的是用于提醒自己很多Java的基础知识需要健全. package com.ssh.action ...
- codechef Little Elephant and Permutations题解
The Little Elephant likes permutations. This time he has a permutation A[1], A[2], ..., A[N] of numb ...
- wxWidgets刚開始学习的人导引(1)——前言
wxWidgets刚開始学习的人导引全文件夹 PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wx ...
- Google Map API V2密钥申请
之前用的都是v1,用的是MapView,好吧,仅仅能认命了.废话不再多说,開始android 的Google Maps Android API v2吧 之前參考了http://www.cnblogs. ...