程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Socket異步通信學習三,socket異步通信

Socket異步通信學習三,socket異步通信

編輯:C#入門知識

Socket異步通信學習三,socket異步通信


接下來是客戶端部分,采用同步接收模式,在SocketClient項目中新建了一個SynServer類,用於存放socket服務器代碼,和AsynServer類似,主要有4個方法:

有一個全局socket,下面四個方法中都用到。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

類框架如下:

 

1.構造方法 public SynClient(IPEndPoint serverIp)

  傳入一個終結點參數,連接服務器,代碼如下:

public SynClient(IPEndPoint serverIp) { Console.WriteLine("**連接服務器**"); socket.Connect(serverIp); Console.WriteLine("**連接成功**"); SynSend("Client:Hello!Server."); SyncReceive(); } View Code

當服務器端開啟監聽服務(Accept()),後,客戶端通過connect()方法連接服務器,serverIp是服務器的終結點地址,本機調試配置為127.0.0.1:port,在main()函數中配置。

2.同步發送函數  public int SynSend(string msg)

public int SynSend(string msg) { Socket socket = this.socket; byte[] data = Encoding.UTF8.GetBytes(msg); try { int sendLength = socket.Send(data); Console.WriteLine("SynSend {0} bytes to server:{1} successfully", sendLength,socket.RemoteEndPoint.ToString()); } catch (SocketException e) { Console.WriteLine("發送失敗:{0} \n Error code:{1}", e.Message, e.ErrorCode); return e.ErrorCode; } return 0; } View Code

3.同步接收函數 public virtual void SyncReceive()

public virtual void SyncReceive() { //StringBuilder sb = new StringBuilder(1024*1024); Thread th = new Thread(() => { while (receiveFlag) { byte[] buffer = new byte[1024]; int r = socket.Receive(buffer); string receiveStr = Encoding.ASCII.GetString(buffer, 0, r); Console.WriteLine(receiveStr); //sb.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, r)); } }); th.Start(); } View Code

與異步不同,同步發送接收時系統不會像異步收發時自動開線程,所以SynSend()會阻礙主線程,因為只發送了一次,所以沒有為它手動開線程,而SyncReceive()給它開了一個線程,線程中使用while循環一直接收,是程序在接收的過程中還可以處理其他業務。

4.釋放資源函數  public void Close()

public void Close() { socket.Dispose(); socket.Close(); } View Code

服務器和客戶端類都寫好後,我們來調試一下,在兩個主函數中配置終結點,並調用服務類,截圖如下:

服務器: 使用本機地址127.0.0.1端口8888

客戶端:終結點地址和服務器開的監聽地址一致

補充一下,第一篇中的框架截圖中有錯別字,在截一次------

最後測試一下結果,進入Debug目錄,先打開SocketServer.exe,再打開SocketClient.exe,顯示結果如下:

本次通信成功,客戶端收到了服務器的消息,服務器也收到了客戶端的消息。

前三篇中完成了最基本的通信,接下來文章將在此基礎上增加通信控制,以及解決接收時的黏包問題。如果大家覺得博文中有什麼不足的地方,歡迎指出,我在努力提高自己的技術是也會努力提高我的寫作技巧和表達能力的:-)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved