Socket Programming Considerations (1)

Posted on 2010-07-26 09:31 天快黑了 阅读(1807) 评论(1)  编辑  收藏 所属分类: Socket
第一次开博,第一次写文章。文笔不好,只是记录一下个人心得。

最近一直在做Socket程序,这里把一些Socket程序的注意事项总结一下。今天先说说Socket中的Timeout,其它的下次补全。


1.       Socket Timeout

Socket程序的时候需要注意设置下面的timeout,避免对方没有响应的时候,导致Socket程序挂起或等待时间过长

1.1         Accept Timeout

Accept timeout 仅对ServerSocket有用。ServerSocket 使用accept()方法来监听客户端Socket的连接。

默认,ServerSocket.accept() 方法会一直阻塞直到有客户端来连接。通常,我们不需要设置accept timeout.

但有时候特殊情况,还是要考虑设置accept timeout.

比如: 程序A给程序B发了一个JMS消息,然后程序A启动一个Socket Server,想通过socket等待接收程序B的返回消息。如果不设置accept timeout, 并且程序B因为某些原因一直不能连接Socket Server,最终会导致程序A挂起。

Accept Timeout可以这样设置:

ServerSocket serverSocket = new ServerSocket(5555);

serverSocket.setSoTimeout(5000); // in milliseconds

while (true) {

    Socket socket = serverSocket.accept();

        …

}

1.2         Connect Timeout

Client端连接Server端的时候,可以指定Connect Timeout

如果没有指定,会使用操作系统的默认值:

OS

Default TCP timeout

BSD

75 seconds

Linux

189 seconds

Solaris

225 seconds

Windows XP

21 seconds

Connect Timeout可以这样设置:

SocketAddress socketAddress = new InetSocketAddress(host, port);

socket = new Socket();

socket.connect(socketAddress, connectTimeout);

1.3         Receive Timeout

socket从另一方接收数据时,可以设置Receive Timeout

默认没有timeoutsocket会一直阻塞直到有数据可读取。

Receive Timeout可以这样设置:

Socket socket = new Socket(host, port);

socket.setSoTimeout(timeout);

1.4         Send Timeout

Send Timeoutsocket给另一方发送数据时使用的。

不过Java里没有办法设置Send Timeout.

当然,socket发送数据的时候,会首先发送到本机OS的一个buffer内。一般只要一次发送的数据不是很大,即使对方挂起或暂时不能接收数据,也不会导致发送方挂起。


Feedback

# re: Socket Programming Considerations (1)  回复  更多评论   

2010-07-27 10:49 by heqs
不错,写的很详细。。。期待你的下一章。。。

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 5, comments - 25, trackbacks - 0, articles - 1

Copyright © 天快黑了