欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)文章

  • C#實現(xiàn)字符串首字母大寫的方法示例

    C#實現(xiàn)字符串首字母大寫的方法示例

    這篇文章主要給大家介紹了關(guān)于利用C#實現(xiàn)字符串首字母大寫的相關(guān)資料,這是在最近工作中遇到的一個需求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 解決C#中取消方向鍵對控件焦點控制的實現(xiàn)方法

    解決C#中取消方向鍵對控件焦點控制的實現(xiàn)方法

    本篇文章是對C#中取消方向鍵對控件焦點控制的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • UnityShader使用速度映射圖實現(xiàn)運動模糊

    UnityShader使用速度映射圖實現(xiàn)運動模糊

    這篇文章主要為大家詳細介紹了UnityShader使用速度映射圖實現(xiàn)運動模糊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#中查找Dictionary中重復(fù)值的方法

    C#中查找Dictionary中重復(fù)值的方法

    這篇文章主要介紹了C#中查找Dictionary中重復(fù)值的方法,有需要的朋友可以參考一下
    2014-01-01
  • 使用C#編寫一個Web服務(wù)器

    使用C#編寫一個Web服務(wù)器

    在.NET世界中,C#是一種功能強大的編程語言,常被用于構(gòu)建各種類型的應(yīng)用程序,本文主要為大家介紹了如何使用C#編寫一個簡單的Web服務(wù)器,需要的可以參考下
    2024-03-03
  • C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能示例

    C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能示例

    這篇文章主要介紹了C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能,可實現(xiàn)針對客戶端系統(tǒng)CPU、硬盤、主板等硬件信息及客戶端操作系統(tǒng)、IP、MAC等信息的操作技巧,需要的朋友可以參考下
    2017-01-01
  • C#?崩潰異常中研究頁堆布局的詳細過程

    C#?崩潰異常中研究頁堆布局的詳細過程

    最近遇到一位朋友的程序崩潰,發(fā)現(xiàn)崩潰點在富編輯器 msftedit 上,這個不是重點,重點在于發(fā)現(xiàn)他已經(jīng)開啟了 頁堆,由于 頁堆 和 NT堆 的內(nèi)存布局完全不一樣,這一篇結(jié)合我的了解以及 windbg 驗證來系統(tǒng)的介紹下 頁堆,需要的朋友可以參考下
    2022-10-10
  • C#連接數(shù)據(jù)庫的幾種方法

    C#連接數(shù)據(jù)庫的幾種方法

    這篇文章介紹了C#連接數(shù)據(jù)庫的幾種方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • c# 開機啟動項的小例子

    c# 開機啟動項的小例子

    c# 開機啟動項的小例子,需要的朋友可以參考一下
    2013-03-03
  • C#實現(xiàn)格式化SQL語句的示例代碼

    C#實現(xiàn)格式化SQL語句的示例代碼

    這篇文章主要為大家詳細介紹了C#如何實現(xiàn)格式化SQL語句的功能,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08

最新評論