socketJava服務
『壹』 java Socket中伺服器斷開後,客戶端為什麼沒有拋異常
在客戶端退出之後,會出現socket連接中斷,此時是會拋出異常,在拋出異常時列印中斷的客戶端即可。
1. while(Binput.read()!= -1) 這種方法能判斷出客戶端輸入是否為空,客戶端斷開能跳出死循環,但是得到的數據卻從第二個開始了,所以這方法不適宜。
2. 在死循環中加入以下代碼:
try {
socket.sendUrgentData(0);
} catch (IOException e) {
done= false; //如果拋出了異常,那麼就是斷開連接了 跳出無限循環
}
『貳』 Java Socket常見異常處理
Java Socket編程中,常見異常處理是關鍵技能之一,下文將詳細介紹幾種主要異常及其解決方法。
首先,Java.net.SocketTimeoutException表示超時錯誤,分為連接超時和讀取超時。連接超時多由網路不穩定造成,而讀取超時原因可能更復雜,包括下游服務響應時間過長。解決方法需對網路環境進行排查。
其次,Java.net.BindException: Address already in use: JVM_Bind表示埠被佔用。使用netstat –an命令可查看被佔用埠,調整未被佔用埠即可。
再者,Java.net.ConnectException: Connection refused: connect表示連接被拒絕。該異常可能由IP地址錯誤或服務端服務崩潰引起。解決策略包括驗證IP地址、確認服務端服務狀態。
Java.net.SocketException: Socket is closed表示連接已關閉。此異常在通信一方主動關閉Socket連接後,另一方再次進行讀寫操作時產生。避免該異常的策略在於確保連接操作的正確性。
Java.net.SocketException: Connection reset/Connect reset by peer: Socket write error表示連接被重置,主要由一方關閉Socket或異常退出導致。解決策略與上文類似。
Java.net.SocketException: Broken pipe表示通信管道已損壞。在接收到「Connect reset by peer: Socket write error」後,繼續寫數據時會拋出此異常。解決方法與解決「Connection reset」類似。
Java.net.SocketException: Too many open files表示進程打開文件句柄數超過限制。高並發環境下易出現此問題。使用lsof -p pid命令可查看進程打開的文件,排查資源泄露。如無泄露,可通過設置增加最大文件句柄數。
通過掌握上述異常及其解決策略,可有效提升Java Socket編程的穩定性與可靠性。
『叄』 java socket輸入流inputStream.read(byte[])方法一次讀入多幀數據,也就是多幀數據連在一起
在使用Java Socket的inputStream.read(byte[])方法時,如果服務端發送數據的速度超過客戶端讀取的速度,客戶端可能會一次性讀取到多幀數據連在一起的情況。這種情況下,數據包的讀取和處理就需要特別注意。一種處理方式是在服務端將每一幀數據作為一行寫入Socket,客戶端則通過BufferedReader逐行讀取。這樣可以確保每次讀取的數據都是一個完整的數據幀。
具體實現步驟如下:
1. 在服務端使用PrintWriter將數據幀作為一行寫入Socket輸出流:
2. 代碼示例如下:
java
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(data);
2. 在客戶端,通過BufferedReader逐行讀取Socket輸入流的數據:
2. 代碼示例如下:
java
BufferedReader reader = new BufferedReader(new BufferedInputStream(socket.getInputStream()));
String s = reader.readLine();
這種方式可以確保客戶端每次讀取到的數據都是一個完整的數據幀,而不會出現多幀數據連在一起的情況。通過這種方式,可以更好地管理和處理Socket通信中不同幀數據的讀取。
使用這種方法處理數據幀時,需要注意的是,每一幀數據必須以換行符結束,這樣才能被正確地解析為一行。此外,客戶端在讀取每一行數據後,應該進行適當的解析和處理,以確保數據的完整性和正確性。
通過這種方式處理數據幀,可以有效地解決服務端發送數據速度過快,而客戶端讀取速度較慢的問題,從而提高數據通信的穩定性和可靠性。