`
rainshow
  • 浏览: 31558 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

系统运行一段时间后,客户端不能连接上服务器(有SOCKET开发经验的欢迎一起讨论)

阅读更多
情况是这样的,我们的一台服务器连接比较多。他由两个部分组成,WEB部分和应用服务。这台服务器存在以下几种连接

1)和另外一个服务器的长连接
2)和几百台设备的短连接(服务器需要频繁访问这些设备)
3)从这台服务器的WEB到应用的短连接(需要应用转发到设备成功后再原路返回)
4)和客户端的长连接(把设备信息发送给客户端查看)

服务器刚启动时间后运行很正常,大概过了一个星期后,开始逐渐不能连接上这台服务器。
=========================================================================
这个可能是连接的相关资源耗尽了,NETSTAT一下会发现一些TIME_WAIT,还有少数的几个FIN_WAIT_1,至于具体什么耗尽了,我也说不上来。因为这种情况在测试环境中比较难模拟,还请各位有类似开发经验的能多多发表自己的意见,谢谢!
分享到:
评论
8 楼 xulu286880921 2011-08-20  
  
7 楼 ken1984 2008-01-01  
rainshow 写道
看了几篇文章传说socket.setReuseAddress(true)可以让TIME_WAIT的状态的可以重用。非常可惜的是即便是使用了这个参数也没用,后来看到好像是JDK的一个BUG,见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296




转一下
其实这个问题在Richard Stevens的《Unix网络编程指南》卷一里有很详细的
解答(中文版P166-168页)。这里我只是写几个基本的例子来验证这个问题。
    首先声明一个问题:当两个socket的address和port相冲突,而你又想重用地
址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只
有两者之一有这个特性还是有问题的。
    SO_REUSEADDR可以用在以下四种情况下。
    (摘自《Unix网络编程》卷一,即UNPv1)
    1、当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启
动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
    2、SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但
每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可
以测试这种情况。
    3、SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个soc
ket绑定的ip地址不同。这和2很相似,区别请看UNPv1。
    4、SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的
多播,不用于TCP。

6 楼 eserver220 2007-12-31  
    检查一下网络设置是否有问题。 子网掩码是否设置过大。 arp -a看看mac表的状态。

还有有时unix会启动routed进程。看看路由表是否有问题。
5 楼 rainshow 2007-12-30  
看了几篇文章传说socket.setReuseAddress(true)可以让TIME_WAIT的状态的可以重用。非常可惜的是即便是使用了这个参数也没用,后来看到好像是JDK的一个BUG,见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213296

4 楼 minyongbing 2007-12-29  
我也遇到这样类似的问题。在连接是出现了no buffer space available异常。
我的连接是有两种方式:1是建立套节字socket为客户端,向下面的设备发送消息,并接受返回的消息。2是通过建立ftp连接的方式将消息以ftp方式上传文件到下面的设备并同时下载返回文件。
在系统运行2天后出现了上面所说的异常,我的代码里面的tcp连接都有过关闭连接操作。不知道是什么原因造成的。
我的系统是win2k ser ,装了瑞星杀毒软件有防火墙。
3 楼 rainshow 2007-12-28  
timerri 写道
这个是无可用端口的问题。

对外连接时,一般使用系统分配的端口。即使关闭socket,这个socket还会被time_wait一段时间(似乎是1~2分钟左右)。根据系统不同,提供给系统自动分配的端口也是有限的(windows下仅有1000左右)。所以只要在2分钟内有过上千个连接,那么可用端口就会被消耗干净,这时候建立socket就会失败。

解决方法:不要让系统自动分配端口,而在创建socket的时候指定端口,这样可以跳出只能用1000个左右端口的限制。另外还要尽量分散连接建立的时间,不要出现短期内有高连接数的峰值。


LINUX和UNIX下一般系统自动分配的端口会有多少?
我感觉你说的比较正确,连接我可以确定都关闭了,如果不关闭也撑不到一个星期,我们系统的交易压力还是蛮大的。我先按照你的做法测试下看看。
2 楼 timerri 2007-12-28  
这个是无可用端口的问题。

对外连接时,一般使用系统分配的端口。即使关闭socket,这个socket还会被time_wait一段时间(似乎是1~2分钟左右)。根据系统不同,提供给系统自动分配的端口也是有限的(windows下仅有1000左右)。所以只要在2分钟内有过上千个连接,那么可用端口就会被消耗干净,这时候建立socket就会失败。

解决方法:不要让系统自动分配端口,而在创建socket的时候指定端口,这样可以跳出只能用1000个左右端口的限制。另外还要尽量分散连接建立的时间,不要出现短期内有高连接数的峰值。
1 楼 liyong_2003_cn 2007-12-28  
一般来说,一台机器对外连接数是有限的,象你这种情况就是连接没有释放导致的。你可以在建立连接时做计数器,来统计哪一种类型的连接占用的时间长,没有释放,应该很容易找到问题所在的,就跟连接池的处理是一个道理,你也在你的系统中建立一个类似于连接池或对象池的概念,不再由应用进行直接连接,把连接统一管理。

相关推荐

    socket 客户端连接池实现

    Socket客户端连接池是一种在分布式系统或网络编程中提高性能和效率的重要技术。它允许应用程序预先创建并维护一组可重用的Socket连接,从而避免了每次通信时建立新连接的开销。本文将深入探讨Socket客户端连接池的...

    利用socket实现客户端服务器之间简单通信

    4. 第四次挥手:客户端接收到FIN包后,发送一个ACK包作为回应,然后进入TIME_WAIT状态,等待一段时间确保服务器接收到ACK后,连接完全关闭。 在Python中,我们可以使用内置的socket库来实现客户端和服务器的通信。`...

    基于TCP的Socket编程服务器和客户端代码

    在IT领域,网络通信是不可或缺的一部分,而TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本主题聚焦于使用Java进行基于TCP的Socket编程,通过`File_client.java`和`...

    JAVA socket收发数据,并支持断网自动连接

    - 重连策略可以设置为定时重试,或者在一段时间内尝试连接,如果多次失败则进入休眠状态,再过一段时间重新尝试。 5. **心跳机制** - 为了检测连接是否有效,可以引入心跳机制。客户端定时发送小量数据到服务器,...

    Socket多客户端连接

    描述中提到“可运行”,这意味着我们可能有一个示例代码或应用,它已经实现了多客户端连接的Socket服务器。通常,这样的程序会包含以下组件: 1. **服务器端**:创建一个监听Socket,绑定到特定IP和端口,然后调用`...

    Android客户端通过socket与服务器通信

    在移动应用开发中,尤其是在Android平台上,客户端与服务器之间的通信是实现应用功能的关键环节之一。Socket编程作为一种基础且强大的网络通信方式,被广泛应用于实时数据传输、远程控制以及游戏等领域。本文将深入...

    一个基于Qt的文件网络传输项目,服务器运行在linux,客户端运行在win10系统。.zip

    4. **Linux服务器**:服务器端运行在Linux系统上,可能采用了如Socket服务端编程技术,处理客户端的连接请求,管理文件存储和传输。Linux作为服务器操作系统,因其稳定性、安全性和性能而被广泛使用。 5. **Windows...

    android客户端加服务端的socket长连接

    在Android应用开发中,实现客户端与服务端的长连接通信,常常会用到Socket编程。Socket,也称为“套接字”,是网络通信的一种基础工具,它提供了进程间或者网络间进程的通信机制。本篇将详细介绍如何在Android客户端...

    socket自动连接和多客户端管理

    例如,当网络中断后,客户端应能够检测到连接丢失,并在一段时间后自动重新尝试连接。这需要编写合适的错误处理代码,确保在网络不稳定时也能维持服务的可靠性。 其次,我们探讨“多客户端管理”。在一个服务器端...

    SOCKET网络编程服务器端和客户端代码(同步通信)

    当有连接请求时,服务器接受连接并建立一个新的`SOCKET`用于与客户端进行数据交换。 3. **客户端编程**:客户端是发起连接请求的程序。它需要知道服务器的IP地址和端口号,然后创建一个`SOCKET`,发起连接请求。...

    基于TCP的socket通信,含服务器和客户端

    2. **客户端**:客户端则需要知道服务器的IP地址和端口号,通过`socket()`创建套接字后,使用`connect()`函数向服务器发起连接请求。一旦连接成功,客户端就可以通过套接字发送数据到服务器,并接收服务器返回的数据...

    Android客户端socket.io官方Demo完整可运行版

    Socket.IO 是一个实时应用框架,它为开发人员提供了一种简单的方式来实现在Web上进行双向通信,即服务器和客户端可以实时地、双向地交换数据。这个框架支持多种浏览器和平台,包括Android。在Android客户端使用...

    Socket客户端和服务器端Demo

    总结,Socket编程是网络通信的核心技术之一,理解和掌握Socket客户端和服务器端的实现,有助于开发跨平台的网络应用。通过创建ServerSocket和Socket,以及使用输入输出流进行数据交换,我们可以构建出可靠且高效的...

    Socket客户端.zip

    Socket客户端在IT行业中是网络编程的一个重要组成部分,主要用于实现不同计算机之间的通信。Socket,也称为套接字,是操作系统提供的一种进程间通信机制,尤其在网络环境中,它为应用程序提供了发送和接收数据的能力...

    MFC socket 服务器和客户端单文件demo

    客户端则会创建一个Socket对象,与服务器建立连接后,可以发送和接收数据。 在TCP模式下,客户端首先通过Connect()函数尝试与服务器建立连接,然后通过Send()函数发送数据,Receive()函数接收数据。在UDP模式下,...

    socket 客户端

    在操作系统层面,socket接口提供了低级别的网络通信功能,允许程序员创建、连接和通信网络上的进程。Socket可以被看作是通信的管道,通过它,数据能够从一台机器的进程传递到另一台机器的进程。 **Socket类型** ...

    andorid客户端与服务器端连接示意图

    如果一段时间内双方都没有数据交换,可以理解为连接断开。 3. **线程管理**:为了保证用户界面的流畅性,通常使用多线程来处理网络通信。一个典型的设置是使用一个发送线程负责将数据放入发送队列,另一个接收线程...

    Socket服务器和客户端,Console模式

    当有客户端连接时,accept()函数会返回一个新的Socket用于与客户端进行数据交换。服务器端通常会使用一个循环来处理多个并发的客户端连接,这就是所谓的多连接处理模型。 客户端则需要创建一个Socket,通过connect...

    Socket服务器及其客户端

    Socket编程允许我们在网络上创建可通信的应用程序,其中,一个应用(通常称为服务器)监听特定端口上的连接请求,而另一个应用(通常称为客户端)主动发起连接请求到服务器的端口。 #### 一、Socket服务器 服务器...

    Socket连接池的简单应用

    下面是一段示例代码,展示了如何创建和使用Socket连接池: ```csharp // 定义Socket类 public class XieGouSocket { public Socket m_socket; // Socket对象 public bool m_isFree; // 判断是否空闲 public int ...

Global site tag (gtag.js) - Google Analytics