第一次開博,第一次寫文章。文筆不好,只是記錄一下個人心得。
最近一直在做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
默認沒有timeout,socket會一直阻塞直到有數據可讀取。
Receive Timeout可以這樣設置:
Socket socket = new Socket(host, port);
socket.setSoTimeout(timeout);
1.4 Send Timeout
Send Timeout是socket給另一方發送數據時使用的。
不過Java里沒有辦法設置Send Timeout.
當然,socket發送數據的時候,會首先發送到本機OS的一個buffer內。一般只要一次發送的數據不是很大,即使對方掛起或暫時不能接收數據,也不會導致發送方掛起。