本文摘自:http://www.cnblogs.com/highriver/archive/2012/01/16/2324035.html
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连接超时之前,我们先来了解一下几个基本概念: 1. **Socket**:是一种用于进程间通信的机制,通过它可以实现在不同计算机或者同一台计算机上的进程之间的数据交换。 2. **阻塞模式与非阻塞...
在TCP中,Socket连接是基于三次握手建立的,而在UDP中则没有连接的概念,直接进行数据发送。 当进行Socket连接时,可能会出现超时的情况。这通常是因为服务器响应时间过长,或者网络延迟、丢包导致的连接无法成功...
首先,理解Socket的基本概念至关重要。Socket是应用层与传输层之间的接口,它允许应用程序通过TCP/IP协议进行网络通信。在接收数据时,如果网络延迟或数据量过大,Socket的recv()方法可能会阻塞,直到接收到完整的...
#### 一、Socket超时的基本概念 在进行网络通信时,由于各种原因(如网络拥堵、服务器响应慢等),可能会出现长时间没有数据传输的情况。为了避免这种情况导致程序无限制地等待下去,可以为Socket对象设置一个超时...
Java中的Socket超时机制是网络编程中非常关键的一部分,它涉及到网络通信的可靠性和效率。Socket是基于TCP/IP协议实现的,提供了应用层与传输层之间的接口,让我们可以通过流(InputStream和OutputStream)来读写...
Socket池和Socket连接池是网络编程中的重要概念,主要用于提高应用程序的性能和效率。在处理大量并发网络连接时,传统的单个Socket连接方式可能会导致系统资源的过度消耗,因此引入了Socket池技术。 Socket,全称是...
套接字是计算机网络编程中的一个基本概念,它提供了进程间通信(IPC)和网络通信的能力,使得不同设备上的应用程序能够相互通信。在本篇文章中,我们将深入探讨SocketTool的功能、用途以及它如何利用Socket技术来...
Socket编程是计算机通信领域中的一个基础概念,它允许不同设备间的进程通过网络进行数据交换。在MQL4中,socket功能被用来实现与远程服务器的连接,例如获取实时数据、发送交易指令或与其他应用程序进行交互。 在...
Socket是网络编程中的一个抽象概念,它代表了两台机器间的一个双向通信链路。在Java中,`java.net.Socket`类和`java.net.ServerSocket`类提供了Socket编程的基础API。`ServerSocket`用于监听客户端的连接请求,而`...
Socket编程是计算机网络通信中的重要概念,主要用于实现进程间的网络通信。在本示例中,我们探讨的是如何使用Socket进行程序间的交互。Socket可以被看作是两台计算机之间的通信端点,允许它们通过网络交换数据。下面...
Socket类还有许多其他属性和方法,如设置超时、禁用Nagle算法等,可以根据具体需求进行配置。 在`SocketTest`这个项目中,可能包含了示例代码,用于演示如何使用C#的Socket进行网络通信。学习这些示例可以帮助理解...
然而,处理Socket连接及读写数据时可能会遇到超时的问题,即连接超时或数据读写超时。本文将深入探讨这些问题,并提供解决方案。 首先,PHP提供了`fsockopen()`函数用于创建Socket连接,它接受IP地址、端口号以及...
首先,我们需要理解Socket类的基本概念,它是网络编程的基础,允许我们通过TCP或UDP协议与远程服务器进行低级别的交互。 ### Socket类简介 Socket是网络编程中的一个抽象概念,它代表了应用程序与网络协议栈之间的...
Socket(套接字)是网络编程中的一个重要概念,它为应用程序提供了访问低层传输协议的能力,使得不同主机间的应用程序可以进行通信。 #### 原理 在计算机网络中,两个程序之间通过Socket进行数据交换时,每个Socket...
本文将详细讲解"Socket_M_Client_sockettcp_TCP/IPclient_C++socket_"这个主题,涵盖TCP/IP通信的基本概念、C++中Socket API的使用以及如何构建一个简单的TCP客户端。 首先,TCP/IP(Transmission Control Protocol...
#### 二、TCL Socket 基本概念 在开始之前,我们先了解几个基本的概念: - **Socket**:用于在两个节点之间建立连接并进行数据传输。 - **Server Socket**:服务器端的Socket,负责监听客户端的连接请求。 - **...
1. **Socket基本概念**: - Socket是应用层与传输层之间的接口,允许应用程序通过它发送和接收数据。 - Socket分为两种类型:流式Socket(TCP)和数据报Socket(UDP)。TCP提供面向连接的服务,数据传输可靠;UDP...
#### 一、基本概念与工具介绍 在Windows系统中,可以通过命令提示符下的`net helpmsg [错误代码]`来获取特定错误码的详细解释。例如,如果想查询错误代码10060的信息,只需在命令行中输入`net helpmsg 10060`即可。...
- **SOCKET选项**:Socket类的`setOption()`方法允许设置各种选项,如超时设置、是否启用套接字选项等。 - **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的Socket编程模型,适用于高并发场景,如`Selector`和`...
1. **Socket的概念** Socket,通常被称为“套接字”,是网络编程中的基本组件。它是一个抽象层,用于在不同网络节点之间建立连接并交换数据。Socket提供了在网络中传输数据的双向通道,允许两个进程间通过网络进行...