導航:首頁 > 編程語言 > javasocket是否連接

javasocket是否連接

發布時間:2025-09-14 19:30:06

『壹』 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通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

『叄』 java socket 判斷是否斷開了

首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗並查看相關文檔,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連接。
然後想到是否可以通過OutputStream發送一段測試數據,如果發送失敗就表示遠端已經斷開連接,類似ping,但是這樣會影響到正常的輸出數據,遠端無法把正常數據和測試數據分開。
最後又回到socket類,發現有一個方法sendUrgentData,查看文檔後得知它會往輸出流發送一個位元組的數據,只要對方Socket的SO_OOBINLINE屬性沒有打開,就會自動舍棄這個位元組,而SO_OOBINLINE屬性默認情況下就是關閉的,太好了,正是我需要的!
於是,下面一段代碼就可以判斷遠端是否斷開了連接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}
用ping實現
package com.csdn.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test {
static BufferedReader bufferedReader;
public static void main(String[] args) throws IOException {
try {
Process process = Runtime.getRuntime().exec("ping 192.168.1.104");//判斷是否連接的IP;
bufferedReader = new BufferedReader(new InputStreamReader(process
.getInputStream()));
String connectionStr = "";
while ((connectionStr = bufferedReader.readLine()) != null) {
System.out.println(connectionStr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
}
}
}
ping的方法有個嚴重的BUG,就是你只能判斷對方是否連接網路,而不能判斷客戶端是否開啟...
我在寫聊天室時經常要注意客戶端異常退出的問題(比如客戶直接調用任務管理器結束程序進程),
其實在通過socket.getoutstream和socket.getinputstream流對客戶端發送、接受信息時如果socket沒連接上是會拋出異常的,這也就是為什麼Java會要求網路編程都要寫在try裡面,所以只要在catch裡面寫入客戶端退出的處理就行了,沒必要專門去想什麼方法

閱讀全文

與javasocket是否連接相關的資料

熱點內容
加密貨幣軟錢包排行 瀏覽:832
exe文件反編譯源碼工具下載 瀏覽:39
python6bit灰度圖 瀏覽:733
如何用java編譯東西 瀏覽:823
php多語言包管理方案 瀏覽:251
python程序運行時間自動控制 瀏覽:382
java編譯主函數快捷鍵 瀏覽:785
atom編輯器python 瀏覽:179
安卓優學派如何恢復出廠設置 瀏覽:728
程序員女巫 瀏覽:782
冷凍冷藏壓縮機 瀏覽:851
吉利紅包H5編譯教程 瀏覽:632
ftpsocket編程 瀏覽:688
安卓手機怎麼卡爆 瀏覽:411
親熱一下可以緩解壓力嗎 瀏覽:598
javasocket是否連接 瀏覽:162
蘋果與安卓怎麼傳輸圖片更快nfc 瀏覽:69
安卓王者榮耀怎麼轉移到蘋果段位 瀏覽:258
gcc編譯器安裝gcc10 瀏覽:139
新加坡ec2伺服器如何購買 瀏覽:56