1. java socket里的time_wait狀態怎麼處理有什麼有效的解決辦法嗎,謝謝!
TIME_WAIT這個狀態是TCP/IP設計時為考慮網路的可靠性所必須的,主動發起關閉連接的一方在接收到被動關閉連接方發出的FIN後就會進入TIME_WAIT狀態,這個狀態最長會持續2*MSL(Max Segment Life)時間,其作用是(1)主動方發出的ACK可能會在網路中丟失,如果丟失被動方會重新發出FIN,如果提前關閉了連接就無法接收到重發的FIN。(2)使游盪在網路中的分組在經過2*MSL超時後消失。
TIME_WAIT這個設計是為了網路可靠性的考慮,具體設定時間長短需要根據網路情況決定,超時時間Windows默認設置一般為四分鍾,也就是說主動方打開的埠最長在四分鍾內不會被釋放,導致可用埠減少。
TIME_WAIT的默認等待時間操作系統設置一般都較為保守,如果網路連接中出現大量TIME_WAIT狀態,可以考慮修改設置(1)修改操作系統配置減少TIME_WAIT時間,Windows上的設置方法是進入注冊表的HKLM->SYSTEM->CurrentControlSet->services->TcpIp->Parameters,添加一個DWORD項「TcpTimedWaitDelay」,時間可設置的短一些(比如60秒或30秒)(2)使用Socket提供的SO_LINGER選項,當SoLinger設置為0時Socket會取消關閉連接等待(不建議)。
2. 在JAVA中,如何設定socket連接的時間超時時間等參數,
Socket類里有一個setTimeout()函數,可以設定socket上讀請求的超時時間;還有在connect()函數中,可以在第二個參數中指定socket連接超時時間。具體可以看看API文檔。
3. java socket通信如何設置連接時長
使用jdk中的setSoTimeout(inttimeout)方法,以毫秒為單位。
參考代碼:
SocketAddressaddress=newInetSocketAddress("192.168.0.104",8888);
ServerSockets=newServerSocket();
s.bind(address);
Socketsocket=s.accept();
socket.setSoTimeout(5*1000);//5秒鍾
將此選項設為非零的超時值時,在與此Socket關聯的InputStream上調用read()將只阻塞此時間長度。
如果超過超時值,將引發java.net.SocketTimeoutException,雖然Socket仍舊有效。選項必須在進入阻塞操作前被啟用才能生效。
另外:超時值必須是>0的數。超時值為0被解釋為無窮大超時值。
4. java.net.SocketTimeoutException: Read timed out
具體的解決方法如下:
修改tomcat配置文件server.xml,找到類似於下面配置:
<Connector port="8086" maxHttpHeaderSize="8192"。
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"。
enableLookups="false" redirectPort="8443" acceptCount="100"。
connectionTimeout="20000" disableUploadTimeout="true" /> 。
將上面的參數disableUploadTimeout值改為false即可。
5. java socket 超時 異常 求解決 java.net.SocketTimeoutException: Read timed out
這個應該有配置超時的地方吧,你把超時時間配置的長一點,另外就是在你調用的地方記錄日誌觀察你這個遠程調用耗時到底是多少。
6. Java:這兩種設置超時時間有什麼區別
以下來自官方文檔,學習編程只要看文檔就可以了
setSoTimeout
public void setSoTimeout(int timeout)
throws SocketException
啟用/禁用帶有指定超時值的 SO_TIMEOUT,以毫秒為單位。將此選項設為非零的超時值時,在與此 Socket 關聯的 InputStream 上調用
read() 將只阻塞此時間長度。如果超過超時值,將引發 java.net.SocketTimeoutException,雖然 Socket
仍舊有效。選項必須在進入阻塞操作前被啟用才能生效。超時值必須是 > 0 的數。超時值為 0 被解釋為無窮大超時值。
參數:
timeout - 指定的以毫秒為單位的超時值。
拋出:
SocketException -
如果底層協議出現錯誤,例如 TCP 錯誤。
connect
public void connect(SocketAddress endpoint,
int timeout)
throws IOException
將此套接字連接到伺服器,並指定一個超時值。超時值零被解釋為無限超時。在建立連接或者發生錯誤之前,連接一直處於阻塞狀態。
參數:
endpoint - SocketAddress
timeout - 要使用的超時值(以毫秒為單位)。
拋出:
IOException - 如果在連接期間發生錯誤
SocketTimeoutException
- 如果在連接之前超時期滿
IllegalBlockingModeException
- 如果此套接字具有關聯的通道並且該通道處於非阻塞模式
IllegalArgumentException
- 如果端點為 null 或者此套接字不支持 SocketAddress 子類
7. java socket 客戶端設置未接收到數據的超時問題
建議如果是長時間沒有收到數據的話,或者是不想長時間等待的話,都可以通過設置超時時間來進行斷開連接,之後繼續處理邏輯(設置socket的setSoTimeout方法實現即可,時間單位是毫秒):
packagesocket;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
importjava.net.InetSocketAddress;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.net.SocketAddress;
importjava.net.SocketException;
importjava.net.SocketTimeoutException;
importjava.text.SimpleDateFormat;
importjava.util.Arrays;
importjava.util.Date;
publicclassSocketService{
publicstaticvoidmain(String[]args){
try{
SocketAddressaddress=newInetSocketAddress("192.168.9.155",3000);
//啟動監聽埠8001
ServerSocketss=newServerSocket();
ss.bind(address);
//接收請求
Sockets=ss.accept();
newThread(newT(s)).start();
}catch(Exceptione){
e.printStackTrace();
}
}
}
classTimplementsRunnable{
publicvoidrun(){
try{
System.out.println(socket.toString());
socket.setKeepAlive(true);
socket.setSoTimeout(5*1000);
String_pattern="yyyy-MM-ddHH:mm:ss";
SimpleDateFormatformat=newSimpleDateFormat(_pattern);
while(true){
System.out.println("開始:"+format.format(newDate()));
try{
InputStreamips=socket.getInputStream();
ByteArrayOutputStreambops=newByteArrayOutputStream();
intdata=-1;
while((data=ips.read())!=-1){
System.out.println(data);
bops.write(data);
}
System.out.println(Arrays.toString(bops.toByteArray()));
}catch(SocketTimeoutExceptione){
e.printStackTrace();
}catch(SocketExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
Thread.sleep(1000);
System.out.println(socket.isBound());//是否邦定
System.out.println(socket.isClosed());//是否關閉
System.out.println(socket.isConnected());//是否連接
System.out.println(socket.isInputShutdown());//是否關閉輸入流
System.out.println(socket.isOutputShutdown());//是否關閉輸出流
System.out.println("結束:"+format.format(newDate()));
}
}catch(Exceptione){
e.printStackTrace();
}
}
privateSocketsocket=null;
publicT(Socketsocket){
this.socket=socket;
}
publicSocketgetSocket(){
returnsocket;
}
publicvoidsetSocket(Socketsocket){
this.socket=socket;
}
}
8. Java:這兩種設置Socket超時時間的方法有什麼不同嗎
connect
timeout
是連接超時,
比如30秒內連接不上。
Socket
timeout
是連接上以後,server沒有回應的超時。
9. java,socket連接如何設置超時
socket.setSoTimeout(int timeout);
恩。應該能實現你的要求
首先socket不是一個阻塞方法,它不會自動去連serverSocket,而是你connect一次它就去連一次,socket本身不存在什麼連接server端超時,所以客戶端的連接超時是由你的程序去控制的,比如用線程。
其次,惡意連接這個問題,其實我已經給你解決了,在server端拿到socket後,不就能用socket.setSoTimeout()來設置連接時間了么?
10. java如何設定socket等待連接時的超時時間
如果IP或埠填錯了 就用socket 的 setSoTimeout(timeout);這個方法 這個是連接超時時間,單位是毫秒,就是在timeout/1000秒內如果沒有完成TCP連接,就會觸發超時異常。