C# Socket通信的實現(xiàn)(同時監(jiān)聽多客戶端)
更新時間:2021年04月16日 09:29:03 作者:WizradMyL
這篇文章主要介紹了C# Socket通信的實現(xiàn)(同時監(jiān)聽多客戶端),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
看代碼~
//創(chuàng)建socket對象 //第一個參數(shù):設(shè)置網(wǎng)絡(luò)尋址的協(xié)議、第二參數(shù)設(shè)置數(shù)據(jù)傳輸?shù)姆绞?、第三個參數(shù)設(shè)置通信協(xié)議 Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2.綁定IP端口 string str = "127.0.0.1"; int ports = 55555; IPAddress ip = IPAddress.Parse(str); IPEndPoint ipENdpoint = new IPEndPoint(ip, ports); serverSocket.Bind(ipENdpoint); //3.開啟監(jiān)聽 serverSocket.Listen(10); label5_Timer.Text = "開始監(jiān)聽···"; //4.開始接受客戶端的鏈接 ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket); } public void StartAcceptClient(object state) { var serverSocket = (Socket)state; this.AppendTextLog("服務(wù)器開始接受客戶端的鏈接"); while (true) { try { Socket prosock = serverSocket.Accept(); //將遠程鏈接的客戶端的IP地址和socket存入集合中 dicSocket.Add(prosock.RemoteEndPoint.ToString(), prosock); string ipPort = prosock.RemoteEndPoint.ToString(); MedicineDevice ns = new MedicineDevice(); SQLMachine j = new SQLMachine(); j.MedicineDeviceStatus(ipPort, "在線"); //鏈接對象的信息 string stinfo = prosock.RemoteEndPoint.ToString(); this.AppendTextLog(string.Format("客戶端{0}鏈接上了", stinfo)); ClientProSocketList.Add(prosock); //服務(wù)器接收客戶端的消息 ThreadPool.QueueUserWorkItem(new WaitCallback(this.ReceiveData), prosock); } catch (Exception e) { return; //throw; } }
public void ReceiveData(object obj) { var prosock = (Socket)obj; byte[] data = new byte[1024 * 1024]; //方法返回代表實際接受的數(shù)據(jù)的長度 while (true) { int realen = 0; try { realen = prosock.Receive(data, 0, data.Length, SocketFlags.None); } catch (Exception e) { //異常退出 AppendTextLog(string.Format("設(shè)備 {0} 異常退出", prosock.RemoteEndPoint.ToString())); StopCOnnecte(prosock); return; } if (realen <= 0) { //對方正常退出 AppendTextLog(string.Format("設(shè)備 {0} 正常退出:", prosock.RemoteEndPoint.ToString())); } prosock.Shutdown(SocketShutdown.Both); prosock.Close(); ClientProSocketList.Remove(prosock); return; } //接受到的數(shù)據(jù) string fromClientMsg = Encoding.Default.GetString(data, 0, realen); AppendTextLog(string.Format("接收到 {0} 的消息是:{1}", prosock.RemoteEndPoint.ToString(), fromClientMsg));}} private void StopCOnnecte(Socket prosock) { try { if (prosock.Connected) { prosock.Shutdown(SocketShutdown.Both); prosock.Close(100); } } catch (Exception ex) { } } public void AppendTextLog(string txt) { if (textBox_Message.InvokeRequired) { textBox_Message.BeginInvoke(new Action<string>(s => { this.textBox_Message.Text = string.Format("{0}\r\n{1}", s, textBox_Message.Text); } ), txt); //同步方法 //textBox_Message.Invoke(new Action<string>(s => // { // this.textBox_Message.Text = string.Format("{0}\r\n{1}", s, textBox_Message.Text); // } // ), txt); } else { this.textBox_Message.Text = string.Format("{0}\r\n{1}", txt, textBox_Message.Text); } } //在粘貼代碼時可能有漏'{'或'}'
補充:C# Socket的Listen監(jiān)聽方法
看代碼~
_serverSocket.Listen(10); public void Listen(int backlog);
Listen方法的整型參數(shù)表示的是:排隊等待連接的最大數(shù)量,注意這個數(shù)量不包含已經(jīng)連接的數(shù)量
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
UnityShader使用速度映射圖實現(xiàn)運動模糊
這篇文章主要為大家詳細介紹了UnityShader使用速度映射圖實現(xiàn)運動模糊,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02