C socket通訊兩個最經典錯誤解決方案

2022-03-08 05:27:54 字數 1278 閱讀 1956

1、經典錯誤之 無法訪問已釋放的物件。 物件名:「system.net.sockets.socket」

(1)、問題現場

(2)、問題敘述

程式中的某個地方呼叫到了socket.close後,這個socket還被呼叫,就出爆出上面錯誤!

(3)、解決方案

使用下面一句: 

if (stsend != null && stsend.connected)

stsend != null :這一句在socket.close之後,會無效的,因為關閉socket連線時已經將其所有連線的資源都釋放了;故要與connected全用;

stsend.connected:獲取乙個值,該值指示 socket上次操作是send還是receive形式連線到遠端主機,如果都不是,那就是斷開了。

擴充套件說明:

所有非託管資源程式設計師必須能控制資源釋放,諸如資料庫連線,socket連線等在使用後都應當顯示關閉,如果是長連線,在程式退出時應當確保所有占用的連線都被關閉。

2、經典錯誤之 "遠端主機強迫關閉了乙個現有的連線。"(1)問題現場

(2)、問題敘述

如下圖,對於網路的經典問題,由於是server和client中的任意一方主動斷開連線,導致彈出 「遠端主機強迫關閉了乙個現在連線」的異常。這種情況,會導致程式提示異常,無法繼續往下執行。

(3)、解決方案

可以通過異常處理的方式,通過異常來提示網路不正常,從而跳出該程式分支,不至於因為異常問題程式癱瘓!

如下圖,一catch到這類system.net.sockets.socketexception異常(當然這裡把它設為exceptioin異常,抓取的範圍更廣),那麼就用messagebox給使用者乙個提示,然後從該分支退出就行了。

Android socket通訊的兩個問題

最近學習android開發的時候發現兩個問題 1.在進行socket通訊時候的,new datagramsocket 總是失敗,丟擲異常。導致udp連線無法 建立。除錯後發現 socket failed eacces permission denied 原因是建立的套接字沒有限權對外連線。在andr...

juc Exchanger兩個執行緒通訊交換資料

方法exchange 阻塞的特性類exchanger中的exchange 方法具有阻塞的特色,也就是此方法被呼叫後等待其他執行緒來取得資料,如果沒有其他執行緒取得資料,則一直阻塞等待。public class threada extends thread public void run catch ...

兩個lock的經典使用示例

示例一 public class numberprintdemo catch interruptedexception e 當state 1時,輪到執行緒1列印5次數字 for int j 0 j 5 j system.out.println 執行緒1列印完成後,將state賦值為2,表示接下來將輪...