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

 

posted @ 2017-08-18 16:02  清晨时光  阅读(7648)  评论(0编辑  收藏  举报