C# Socket通信的實(shí)現(xiàn)(同時(shí)監(jiān)聽(tīng)多客戶端)
看代碼~
//創(chuàng)建socket對(duì)象 //第一個(gè)參數(shù):設(shè)置網(wǎng)絡(luò)尋址的協(xié)議、第二參數(shù)設(shè)置數(shù)據(jù)傳輸?shù)姆绞?、第三個(gè)參數(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.開(kāi)啟監(jiān)聽(tīng) serverSocket.Listen(10); label5_Timer.Text = "開(kāi)始監(jiān)聽(tīng)···"; //4.開(kāi)始接受客戶端的鏈接 ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket); } public void StartAcceptClient(object state) { var serverSocket = (Socket)state; this.AppendTextLog("服務(wù)器開(kāi)始接受客戶端的鏈接"); while (true) { try { Socket prosock = serverSocket.Accept(); //將遠(yuǎn)程鏈接的客戶端的IP地址和socket存入集合中 dicSocket.Add(prosock.RemoteEndPoint.ToString(), prosock); string ipPort = prosock.RemoteEndPoint.ToString(); MedicineDevice ns = new MedicineDevice(); SQLMachine j = new SQLMachine(); j.MedicineDeviceStatus(ipPort, "在線"); //鏈接對(duì)象的信息 string stinfo = prosock.RemoteEndPoint.ToString(); this.AppendTextLog(string.Format("客戶端{(lán)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í)際接受的數(shù)據(jù)的長(zhǎng)度 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) { //對(duì)方正常退出 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); } } //在粘貼代碼時(shí)可能有漏'{'或'}'
補(bǔ)充:C# Socket的Listen監(jiān)聽(tīng)方法
看代碼~
_serverSocket.Listen(10); public void Listen(int backlog);
Listen方法的整型參數(shù)表示的是:排隊(duì)等待連接的最大數(shù)量,注意這個(gè)數(shù)量不包含已經(jīng)連接的數(shù)量
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
C#實(shí)現(xiàn)字符串首字母大寫(xiě)的方法示例
這篇文章主要給大家介紹了關(guān)于利用C#實(shí)現(xiàn)字符串首字母大寫(xiě)的相關(guān)資料,這是在最近工作中遇到的一個(gè)需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01解決C#中取消方向鍵對(duì)控件焦點(diǎn)控制的實(shí)現(xiàn)方法
本篇文章是對(duì)C#中取消方向鍵對(duì)控件焦點(diǎn)控制的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05UnityShader使用速度映射圖實(shí)現(xiàn)運(yùn)動(dòng)模糊
這篇文章主要為大家詳細(xì)介紹了UnityShader使用速度映射圖實(shí)現(xiàn)運(yùn)動(dòng)模糊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02C#編程獲取客戶端計(jì)算機(jī)硬件及系統(tǒng)信息功能示例
這篇文章主要介紹了C#編程獲取客戶端計(jì)算機(jī)硬件及系統(tǒng)信息功能,可實(shí)現(xiàn)針對(duì)客戶端系統(tǒng)CPU、硬盤、主板等硬件信息及客戶端操作系統(tǒng)、IP、MAC等信息的操作技巧,需要的朋友可以參考下2017-01-01C#?崩潰異常中研究頁(yè)堆布局的詳細(xì)過(guò)程
最近遇到一位朋友的程序崩潰,發(fā)現(xiàn)崩潰點(diǎn)在富編輯器 msftedit 上,這個(gè)不是重點(diǎn),重點(diǎn)在于發(fā)現(xiàn)他已經(jīng)開(kāi)啟了 頁(yè)堆,由于 頁(yè)堆 和 NT堆 的內(nèi)存布局完全不一樣,這一篇結(jié)合我的了解以及 windbg 驗(yàn)證來(lái)系統(tǒng)的介紹下 頁(yè)堆,需要的朋友可以參考下2022-10-10c# 開(kāi)機(jī)啟動(dòng)項(xiàng)的小例子
c# 開(kāi)機(jī)啟動(dòng)項(xiàng)的小例子,需要的朋友可以參考一下2013-03-03C#實(shí)現(xiàn)格式化SQL語(yǔ)句的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)格式化SQL語(yǔ)句的功能,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08