記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】

ever_idea發表於2018-04-30

方案主要功能:

       (1)客戶端同步監聽來自伺服器端的資料(開啟子執行緒監聽)

       (2)客戶端向伺服器端傳送資料(主執行緒傳送,並控制)

       (3)IsOnline判斷連線是否中斷,如中斷則子執行緒結束執行


        TcpClient tcpClient;
        NetworkStream ns;
        Thread receiveThread;
        /// <summary>
        /// 網路連線
        /// </summary>
        private void client()
        {
            tcpClient = new TcpClient();  //建立一個TcpClient物件,自動分配主機IP地址和埠號
            string ipaddr = this.IpAddress.Text;
            int port = Int32.Parse(this.Port.Text);
            //MessageBox.Show(ipaddr);
            try
            {
                //發起TCP連線  
                tcpClient.Connect(ipaddr, port);
                if (tcpClient != null)
                {
                    MessageBox.Show("連線伺服器成功");
                    this.button1.Text = "關閉連線";
                    //獲得繫結的網路資料流  
                    ns = tcpClient.GetStream();
                    Control.CheckForIllegalCrossThreadCalls = false;
                    //例項化並啟動接受訊息執行緒  
                    receiveThread = new Thread(receive_message);
                    receiveThread.Start();
                    string mestext = "hello world!";
                    send_message(mestext);
                    connectFlag = true;
                    modeChangeInit();
                }
                else
                {
                    MessageBox.Show("連線伺服器失敗");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }


        /// <summary>
        ///  檢測TCP連線是否存在還是已經中斷
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public bool IsOnline(TcpClient c)
        {
            return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
        }
        //接收訊息
        private void receive_message()
        {
            revWrong = 0;
            while (IsOnline(tcpClient))
            {
                try
                {
                    //建立接收資料的位元組流  
                    byte[] getData = new byte[1024];
                    //從網路流中讀取資料  
                    ns.Read(getData, 0, getData.Length);
                    //將位元組陣列轉換成文字形式  
                    string getMsg = Encoding.Default.GetString(getData);
                    string msgStr = getMsg.Trim('\0');
                    if (!string.IsNullOrEmpty(msgStr))
                        processMsgInShow(msgStr);
                }
                catch (ThreadAbortException)
                {
                    //捕捉到執行緒被終止異常則表示是人為的斷開TCP連線  
                    //不彈出錯誤提示
                    break;
                }
                catch (Exception e)
                {
                    //接受訊息發生異常  
                    MessageBox.Show(e.Message);
                    //並釋放相關資源  
                    if (ns != null)
                        ns.Dispose();
                    break;


                }
            }
            MessageBox.Show("網路中斷");
            /// 當接收中斷時
            ///if (ns != null)
            ///    ns.Dispose();


        }
        // 傳送指令
        private void send_order(commandType no, string mesg)
        {
            string str = ((int)no).ToString();
            string order = string.Format("*0{0};{1}#", str, mesg);
            send_message(order);
        }
        private void send_message(string messageText)
        {
            //將要傳送的文字轉換為字元陣列形式  
            byte[] sendData = Encoding.Default.GetBytes(messageText);
            //將資料寫入到網路資料流中  
            ns.Write(sendData, 0, sendData.Length);
        }
        //斷開連線 
        private void disconnect()
        {
            //斷開TCP連線  
            tcpClient.Close();
            //銷燬繫結的網路資料流  
            ns.Dispose();
            //銷燬接受訊息的執行緒  
            receiveThread.Abort();
            //修改控制元件狀態
            this.button1.Text = "連線";
            connectFlag = false;
            showMessage.Stop();
            // 刪除時鐘
            // showMessage.Dispose();
        }
        ///////////////////////////////////////////////////////////
        /// <summary>
        /// 網路連線
        /// </summary>
        private void client()
        {
            tcpClient = new TcpClient();  //建立一個TcpClient物件,自動分配主機IP地址和埠號
            string ipaddr = this.IpAddress.Text;
            int port = Int32.Parse(this.Port.Text);
            //MessageBox.Show(ipaddr);
            try
            {
                //發起TCP連線  
                tcpClient.Connect(ipaddr, port);
                if (tcpClient != null)
                {
                    MessageBox.Show("連線伺服器成功");
                    this.button1.Text = "關閉連線";
                    //獲得繫結的網路資料流  
                    ns = tcpClient.GetStream();
                    Control.CheckForIllegalCrossThreadCalls = false;
                    //例項化並啟動接受訊息執行緒  
                    receiveThread = new Thread(receive_message);
                    receiveThread.Start();
                    string mestext = "hello world!";
                    send_message(mestext);
                    connectFlag = true;
                }
                else
                {
                    MessageBox.Show("連線伺服器失敗");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        /// <summary>
        ///  檢測TCP連線是否存在還是已經中斷
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public bool IsOnline(TcpClient c)
        {
            return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
        }
        //接收訊息
        private void receive_message()
        {
            revWrong = 0;
            while (IsOnline(tcpClient))
            {
                try
                {
                    //建立接收資料的位元組流  
                    byte[] getData = new byte[1024];
                    //從網路流中讀取資料  
                    ns.Read(getData, 0, getData.Length);
                    //將位元組陣列轉換成文字形式  
                    string getMsg = Encoding.Default.GetString(getData);
                    string msgStr = getMsg.Trim('\0');
                    if (!string.IsNullOrEmpty(msgStr))
                        processMsgInShow(msgStr);
                }
                catch (ThreadAbortException)
                {
                    //捕捉到執行緒被終止異常則表示是人為的斷開TCP連線  
                    //不彈出錯誤提示
                    break;
                }
                catch (Exception e)
                {
                    //接受訊息發生異常  
                    MessageBox.Show(e.Message);
                    //並釋放相關資源  
                    if (ns != null)
                        ns.Dispose();
                    break;

                }
            }
            MessageBox.Show("連線中斷");
        }
        // 傳送指令
        private void send_message(string messageText)
        {
            //將要傳送的文字轉換為字元陣列形式  
            byte[] sendData = Encoding.Default.GetBytes(messageText);
            //將資料寫入到網路資料流中  
            ns.Write(sendData, 0, sendData.Length);
        }
        //斷開連線 
        private void disconnect()
        {
            //斷開TCP連線  
            tcpClient.Close();
            //銷燬繫結的網路資料流  
            ns.Dispose();
            //銷燬接受訊息的執行緒  
            receiveThread.Abort();
            //修改控制元件狀態
            this.button1.Text = "連線";
            connectFlag = false;
        }
        ///////////////////////////////////////////////////////////

參考文章(1):https://blog.csdn.net/godsight/article/details/60968437

參考文章(2):https://www.cnblogs.com/Lexy/p/3556924.html

相關文章