接下來是客戶端部分,採用同步接收模式,在socketclient專案中新建了乙個synserver類,用於存放socket伺服器**,和asynserver類似,主要有4個方法:
有乙個全域性socket,下面四個方法中都用到。
socket socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
類框架如下:
1.構造方法 public synclient(ipendpoint serverip)
傳入乙個終結點引數,連線伺服器,**如下:
publicview codesynclient(ipendpoint serverip)
當伺服器端開啟監聽服務(accept()),後,客戶端通過connect()方法連線伺服器,serverip是伺服器的終結點位址,本機除錯配置為127.0.0.1:port,在main()函式中配置。
2.同步傳送函式 public int synsend(string msg)
publicview codeint synsend(string
msg)
bytes to server: successfully
", sendlength,socket.remoteendpoint.tostring());
}catch
(socketexception e)
\n error code:
", e.message, e.errorcode);
return
e.errorcode;
}return0;
}
3.同步接收函式 public virtual void syncreceive()
publicview codevirtual
void
syncreceive()
});th.start();
}
與非同步不同,同步傳送接收時系統不會像非同步收發時自動開執行緒,所以synsend()會阻礙主線程,因為只傳送了一次,所以沒有為它手動開執行緒,而syncreceive()給它開了乙個執行緒,執行緒中使用while迴圈一直接收,是程式在接收的過程中還可以處理其他業務。
4.釋放資源函式 public void close()
publicview codevoid
close()
伺服器和客戶端類都寫好後,我們來除錯一下,在兩個主函式中配置終結點,並呼叫服務類,截圖如下:
補充一下,第一篇中的框架截圖中有錯別字,在截一次------
最後測試一下結果,進入debug目錄,先開啟socketserver.exe,再開啟socketclient.exe,顯示結果如下:
本次通訊成功,客戶端收到了伺服器的訊息,伺服器也收到了客戶端的訊息。
前三篇中完成了最基本的通訊,接下來文章將在此基礎上增加通訊控制,以及解決接收時的黏包問題。如果大家覺得博文中有什麼不足的地方,歡迎指出,我在努力提高自己的技術是也會努力提高我的寫作技巧和表達能力的:-)
Socket非同步通訊
1.可以通過多執行緒來解決 一會補上 2.socket在tcp udp兩種通訊協議下的非同步通訊 基於tcp的非同步通訊 beginaccept方法和endeaccept方法 包含在system.net.sockets命名空間下。非同步tcp使用beginaccept方法開始接受新的客戶端連線請求,...
非同步Socket通訊總結
服務端 非同步 using system.net using system.net.sockets using system.io using system.text using system.threading public static manualresetevent alldone new ...
非同步Socket通訊總結
前面已經貼了socket的基本程式設計要點和步驟,這裡繼續貼一下關於非同步socket通訊的 服務端 非同步 using system.net using system.net.sockets using system.io using system.text using system.thread...