C# TCP通信客戶端


編寫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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM