編寫winform客戶端程序中使用TCP通信時,可以當獨寫一個通信類來進行處理通信。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using System.Threading; using System.Collections; using System.Drawing; namespace WinCRC110 { /// <summary> /// 通信類 /// </summary> class Client { // tcp通信對象 private TcpClient tcpClient; // tcp通信中讀取數據的對象 private BinaryReader br; // tcp通信中寫數據的對象 private BinaryWriter bw; // 通信的遠程服務端ip private string IP; // 通信的遠程服務端端口 private int port; // 心跳字符串 string heartString = "#@#@"; public delegate void ConnectSucText(string value,Color color); public event ConnectSucText ConnectSucTexts; #endregion #region 構造函數 /// <summary> /// 構造函數 /// </summary> /// <param name="ip">服務器IP</param> /// <param name="port">服務器開放的通信端口號</param> public Client(string ip,int port) { this.IP = ip; this.port = port; } #endregion /// <summary> /// 重連服務端 /// </summary> public void Reconnect() { try { if (tcpClient!=null) { tcpClient.Close(); } tcpClient = new TcpClient(IP, port); //獲取網絡流 NetworkStream networkStream = tcpClient.GetStream(); //將網絡流作為二進制讀寫對象 br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); if (ConnectSucTexts != null) ConnectSucTexts("已連接到服務端"+IP + ":" + port , Color.Green); } catch(Exception ex) { ClassVar.WriteErrorLog("重連省廳服務端出錯:" + Environment.NewLine + "Reconnect" + ex.ToString()); if (ConnectSucTexts != null) ConnectSucTexts("無法連接到服務端"+IP +":"+ port , Color.Red); } } /// <summary> /// 連接服務端 /// </summary> public void Connect() { try { tcpClient = new TcpClient(IP, port); //獲取網絡流 NetworkStream networkStream = tcpClient.GetStream(); //將網絡流作為二進制讀寫對象 br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); if (ConnectSucTexts != null) ConnectSucTexts("已連接到服務端" + IP + ":" + port, Color.Green); } catch(Exception ex) { ClassVar.WriteErrorLog("連接服務端出錯:" + Environment.NewLine + "Connect" + ex.ToString()); if (ConnectSucTexts != null) ConnectSucTexts("無法連接到服務端" + IP + ":" + port, Color.Red); } IniThread(); } private void IniThread() { //后台消息消息線程 Thread threadHeart = new Thread(new ThreadStart(ReceiveData)); threadHeart.IsBackground = true; threadHeart.Start(); //后台心跳消息線程 Thread threadRec = new Thread(new ThreadStart(SendHeart)); threadRec.IsBackground = true; threadRec.Start(); } /// <summary> /// 給服務端發心跳,10秒一次 /// </summary> private void SendHeart() { while (true) { Thread.Sleep(10000); SendMsg(heartString); } } /// <summary> /// 發送消息到服務端的方法,帶發送長度 type=0心跳,1其他 /// </summary> /// <param name="msg">消息內容</param> public void SendMsg(string msgs,int type=0) { try { byte[] msg = Encoding.Default.GetBytes(msgs); if (type != 0) { byte[] temp =new byte[1]; switch (type) { case 1: temp[0] = 0x31; break; case 2: temp[0] = 0x34; break; case 3: temp[0] = 0x33; break; case 4: temp[0] = 0x32; break; } msg = temp.Concat(msg).ToArray(); } int length = msg.Length; short lengthall = (short)(length + 2); byte[] lengthByte = System.BitConverter.GetBytes(lengthall);// ToBytesArray(lengthall); byte[] all = lengthByte.Concat(msg).ToArray(); //然后將字節數組寫入網絡流 if (bw != null && tcpClient.Connected==true) { bw.Write(all); bw.Flush(); if (msgs == heartString)//心跳寫單獨的文件 { ClassVar.WriteLogCommonXT(Environment.NewLine + "成功給服務端發送數據:" + msgs); } else { ClassVar.WriteLogCommon(Environment.NewLine + "成功給服務端發送數據:" + msgs); } } else { this.Reconnect(); } } catch (Exception ex) { ClassVar.WriteErrorLog("發送消息到服務端出錯:" + Environment.NewLine + "SendMsg" + ex.ToString()); } } /// <summary> /// 處理接收的服務端數據 /// </summary> private void ReceiveData() { while (true) { byte[] BytesLenth = null; byte[] BytesContent = null; if (br == null) continue; try { BytesLenth = br.ReadBytes(2); int lenth = BitConverter.ToInt16(BytesLenth, 0); BytesContent = br.ReadBytes(lenth - 2); string conContent = Encoding.Default.GetString(BytesContent); //如果收到是心跳信息 if (conContent == heartString) { Manage.ManageInstance.Msg.TimeSpan = 0; } //加入到消息隊列 else { lock (Manage.ManageInstance.Msg.ObjxtMsgQueue) { Manage.ManageInstance.Msg.STMsgQueue.Enqueue(conContent); } ClassVar.WriteLogCommon(Environment.NewLine + "收到服務端發送過來的數據:" + conContent); } } catch (Exception ex) { ClassVar.WriteErrorLog("接收服務端消息異常:" + Environment.NewLine + "ReceiveData" + ex.ToString()); } } }
主界面初始化
// 服務端IP地址 string _STServerIP="192.168.0.3"; // 服務端端口 Int16 _STServerPort=8111; Client client = new Client(_STServerIP, _STServerPort); client.ConnectSucTexts += new Client.ConnectSucText(SettsLable); ////連接服務端 client.Connect();