C#實現Socket通訊(同時監聽多客戶端)
阿新 • • 發佈:2018-12-02
//建立socket物件 //第一個引數:設定網路定址的協議、第二引數設定資料傳輸的方式、第三個引數設定通訊協議 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.開啟監聽 serverSocket.Listen(10); label5_Timer.Text = "開始監聽···"; //4.開始接受客戶端的連結 ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket); } public void StartAcceptClient(object state) { var serverSocket = (Socket)state; this.AppendTextLog("伺服器開始接受客戶端的連結"); 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); //伺服器接收客戶端的訊息 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]; //方法返回代表實際接受的資料的長度 while (true) { int realen = 0; try { realen = prosock.Receive(data, 0, data.Length, SocketFlags.None); } catch (Exception e) { //異常退出 AppendTextLog(string.Format("裝置 {0} 異常退出", prosock.RemoteEndPoint.ToString())); StopCOnnecte(prosock); return; } if (realen <= 0) { //對方正常退出 AppendTextLog(string.Format("裝置 {0} 正常退出:", prosock.RemoteEndPoint.ToString())); } prosock.Shutdown(SocketShutdown.Both); prosock.Close(); ClientProSocketList.Remove(prosock); return; } //接受到的資料 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);
}
}
//在貼上程式碼時可能有漏'{'或'}'