• 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();
  • 相关阅读:
    AOP 学习
    微服务架构理解[架构图](转)
    C# TSC打印二维码和条形码(转)
    C#注册表操作类--完整优化版(转)
    C#调用TSC条码打印机打印二维码(转)
    C#调用TSC条码打印机打印条码(转)
    TSC打印机使用教程终极版(转)
    海尔电商峰值系统架构设计最佳实践(转)
    亿级Web系统搭建——单机到分布式集群(转)
    数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题(转),可以尝试一下
  • 原文地址:https://www.cnblogs.com/KQNLL/p/7390184.html
Copyright © 2020-2023  润新知