不停的向某个端口发起连接,当达到一定数量的时候,就会连接不上,netstat -a 里面发现端口已经满了。我觉得是windows在哪个地方限制了连接端口的数量,或者socket端口释放得太慢。哪位大虾知道,Win2000上,这种问题该怎么解决?
下面是示例代码:
import java.io.IOException;
import java.net.Socket;public class SocketTest {
public static void main(String[] args) {
for (int i = 0; i < 9999; ++i) {
try {
Socket socket = new Socket("127.0.0.1", 21);
socket.close();
} catch (IOException ioe) {
System.out.println("Error: " + i);
break;
} catch (Exception e) {
System.out.println("Other Exception: " + i);
return;
}
}
System.out.println("End");
}
}

解决方案 »

  1.   

    to  believefym(暮色,miss,迷失,miss) :
    是socket.close()耗时,还是指的windows的socket关闭耗时?
    有什么办法没有啊?
      

  2.   

    这个问题其实跟java或者变成语言没有什么关系,呵呵,做服务器的人都会同样遇到问题的。呵呵。解决之道,加快处理时间(改代码调优),增加服务器(硬件投资)。
    如果调优很耗时也很艰巨,费用又紧张的话,还可以通过以下调整系统内核参数获得一定的改善。
    window nt系列
    在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下增加双字节值的注册表项:
    1)MaxUserPort 
       缺省是5000 (十进制)
       可以设置为最大65534 (十进制)
    2)TcpTimedWaitDelay
       缺省是240 (十进制)
       可以设置为最大30 (十进制)unix/linux
    echo 65536 > /proc/sys/fs/file-max 
    ulimit -n 65536
      

  3.   

    此外在unix/linux的平台下,如果你选用的是FreeBSD的话,那就更加运气一下,可以通过
    echo net.inet.tcp.msl=2000 >> /etc/sysctl.conf 
    /etc/rc.d/sysctl restart
    来调整TIME_WAIT连接的超时,缺省为30000