記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】
阿新 • • 發佈:2018-12-01
方案主要功能:
(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