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#?wpf利用附加屬性實(shí)現(xiàn)界面上定義裝飾器
裝飾器是wpf中可以浮在控件上面的一種組件,我們通??梢杂脕?lái)實(shí)現(xiàn)一些諸如控件拖動(dòng)點(diǎn)、提示框、自定義鼠標(biāo)等界面功能。本文主要是利用附加屬性實(shí)現(xiàn)界面上定義裝飾器,需要的可以參考下2022-12-12
C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器的示例代碼
這篇文章主要介紹了C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C# System.BadImageFormatException問(wèn)題及解決
這篇文章主要介紹了C# System.BadImageFormatException問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
C# SqlSugar批量執(zhí)行SQL語(yǔ)句及批量更新實(shí)體對(duì)象的操作方法
SqlSugar 是一款 老牌 .NET開(kāi)源ORM框架,由果糖大數(shù)據(jù)科技團(tuán)隊(duì)維護(hù)和更新 ,開(kāi)箱即用最易上手的ORM,這篇文章主要介紹了C# SqlSugar批量執(zhí)行SQL語(yǔ)句以及批量更新實(shí)體對(duì)象,需要的朋友可以參考下2024-07-07
c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法
c# asp .net 動(dòng)態(tài)創(chuàng)建sql數(shù)據(jù)庫(kù)表的方法,需要的朋友可以參考一下2013-04-04
C#實(shí)現(xiàn)創(chuàng)建桌面快捷方式與添加網(wǎng)頁(yè)到收藏夾的示例
本文是介紹了c#通過(guò)純代碼創(chuàng)建快捷方式與添加網(wǎng)頁(yè)到收藏夾,非常具有實(shí)用價(jià)值,有需要的朋友可以來(lái)了解一下。2016-10-10

