博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# TCP通信
阅读量:4703 次
发布时间:2019-06-10

本文共 9917 字,大约阅读时间需要 33 分钟。

服务端代码,包含远程客户端类、服务端类、UI。  //远程客户端类 class RemoteClient    {        public TcpClient client{
get; private set;} public BinaryReader br{
get; private set;} public BinaryWriter bw{
get; private set;} public string userName {
get; set; } public RemoteClient(TcpClient client) { this.client = client; NetworkStream networkStream = client.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); this.userName = (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString() + ":"+(client.Client.RemoteEndPoint as IPEndPoint).Port.ToString(); } public void Close() { br.Close(); bw.Close(); client.Close(); } }
///     /// 服务器的类    ///     class _TcpServer    {        //远程客户端对象集合        List
remoteClientList = new List
(); private TcpListener tcpServer; public _TcpServer(string localIP,int port) { ///
使用的本机IP地址 IPAddress localAddress = IPAddress.Parse(localIP); tcpServer = new TcpListener(localAddress, port); tcpServer.Start(); //创建一个线程监听客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); } ///
接收客户端连接 private void ListenClientConnect() { TcpClient newClient = null; while (true) { try { newClient = tcpServer.AcceptTcpClient(); } catch { //当单击“停止监听”或者退出此窗体时AcceptTcpClient()会产生异常 //因此可以利用此异常退出循环 break; } //每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息 RemoteClient user = new RemoteClient(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); remoteClientList.Add(user); ClassVar.WriteLogCommon(Environment.NewLine + "有远程主机连接到本机,远程主机信息:"+user.userName); } } ///
/// 处理接收的客户端数据 /// ///
客户端信息 private void ReceiveData(object userState) { RemoteClient user = userState as RemoteClient; TcpClient client = user.client; while (true) { byte[] BytesLenth = null; byte[] BytesContent = null; try { if (user == null || user.br == null || user.client.Connected == false) { break; } BytesLenth = user.br.ReadBytes(2); int lenth = BitConverter.ToInt16(BytesLenth, 0); BytesContent = user.br.ReadBytes(lenth - 2); string conContent = Encoding.Default.GetString(BytesContent); //如果收到是心跳信息 if (conContent == "0000") { lock (ClassVar.frmMain.objTimeSpan) { ClassVar.frmMain.timeSpan = 0; } ClassVar.WriteLogCommonXT(Environment.NewLine + "收到心跳消息"); } //如果是警情信息则加入到消息队列 else { lock (ClassVar.frmMain.lockQue) { ClassVar.frmMain.queue119Xml.Enqueue(conContent); } ClassVar.WriteLogCommon(Environment.NewLine + "收到数据:" + conContent); } } catch (Exception ex) { RemoveUser(user); ClassVar.WriteErrorLog("接收消息异常:" + Environment.NewLine + "ReceiveData" + ex.ToString()); } } } ///
移除用户 ///
指定要删除的用户 private void RemoveUser(RemoteClient remoteClient) { remoteClientList.Remove(remoteClient); remoteClient.Close(); } }

服务端UI

//服务器给本机发送的心跳计时锁对象        public object lockQue = new object();         //接收的客户端消息列表         public Queue
queue119Xml = new Queue
();
private void IniServer()        {            //启动监听119服务器,用于接收发送119发送的消息            _TcpServer _119TcpListen = new _TcpServer(ClassVar.localIPAddr, 11118);            Thread threadRead119 = new Thread(new ThreadStart(Read119QueThread));            threadRead119.IsBackground = true;            threadRead119.Start();        }       //读取消息队列        private void Read119QueThread()        {            while (true)            {                try                {                    if (queue119Xml.Count > 0)                    {                        lock (lockQue)                        {                            string xml = queue119Xml.Dequeue();                            F119ToLocal(xml);                        }                    }                }                catch (Exception ex)                {                    ClassVar.WriteErrorLog("方法Read119QueThread出错,详细信息:" + ex.ToString());                }                Thread.Sleep(5);            }        }

 

///     /// 客户端类    ///     class _Client    {        // tcp通信对象        private TcpClient tcpClient;        // tcp通信中读取数据的对象        private BinaryReader br;        // tcp通信中写数据的对象        private BinaryWriter bw;        // 通信的远程服务器ip        private string IP;        // 通信的远程服务器端口        private int port;        ///         /// 构造函数        ///         /// 服务器IP        /// 服务器开放的通信端口号        public _Client(string ip,int port)        {            this.IP = ip;            this.port = port;        }        ///         /// 连接服务器        ///         public void Connect()        {            try            {                tcpClient = new TcpClient(IP, port);                //获取网络流                NetworkStream networkStream = tcpClient.GetStream();                //将网络流作为二进制读写对象                br = new BinaryReader(networkStream);                bw = new BinaryWriter(networkStream);            }            catch (Exception ex)            {                ClassVar.WriteErrorLog("连接服务器出错:" + Environment.NewLine + "Connect" + ex.ToString());            }            //后台心跳消息线程            Thread threadHeart = new Thread(new ThreadStart(SendHeart));            threadHeart.IsBackground = true;            threadHeart.Start();        }        ///         /// 重连        ///         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);            }            catch(Exception ex)            {                ClassVar.WriteErrorLog("重连服务器出错:" + Environment.NewLine + "Reconnect" + ex.ToString());            }        }              ///         /// 给服务器心跳,10秒一次        ///         private void SendHeart()        {            while (true)            {                Thread.Sleep(10000);                SendMsg("0000");            }        }                ///         /// 发送消息到服务器的方法,带发送长度        ///         /// 消息内容        public void SendMsg(string msgs)        {            try            {                byte[] msg = Encoding.UTF8.GetBytes(msgs);                int length = msg.Length;                short lengthall = (short)(length + 2);                byte[] lengthByte = System.BitConverter.GetBytes(lengthall);                byte[] all = lengthByte.Concat(msg).ToArray();                //然后将字节数组写入网络流                if (bw != null && tcpClient.Connected==true)                {                        bw.Write(all);                        bw.Flush();                        if (msgs == "0000")//心跳写单独的文件                        {                            ClassVar.WriteLogCommonXT(Environment.NewLine + "成功发送数据:" + msgs);                        }                        else                        {                            ClassVar.WriteLogCommon(Environment.NewLine + "成功发送数据:" + msgs);                        }                }                else                {                    this.Reconnect();                }            }            catch (Exception ex)            {                ClassVar.WriteErrorLog("发送消息到服务器出错:" + Environment.NewLine + "SendMsg" + ex.ToString());            }        }    }

 客户端代码

// 与服务器通信的类        _Client client ;        //服务器给本机发送的心跳计时锁对象        public object objTimeSpan = new object();        //服务器给本机发送的心跳计时        public int timeSpan = 0; private void IniClient()        {            client = new _Client(_119ServerIP, _119ServerPort);            //连接服务器            client.Connect();            //与服务器重连判断线程            Thread threadChenck = new Thread(new ThreadStart(CheckHeart));            threadChenck.IsBackground = true;            threadChenck.Start();            client.SendMsg("测试发送信息到服务端");        }        // 重连判断        private void CheckHeart()        {            while (true)            {                Thread.Sleep(3000);                lock (objTimeSpan)                {                    timeSpan = timeSpan + 2;                }                if (timeSpan >= maxTime)                {                    client.Reconnect();                    timeSpan = 0;                }            }        }

 

转载于:https://www.cnblogs.com/KQNLL/p/5234160.html

你可能感兴趣的文章
非常好的JSUI
查看>>
基于EasyNVR摄像机无插件直播流媒体服务器实现类似于单点登录功能的免登录直播功能...
查看>>
python学习0day
查看>>
课堂练习之检测水军
查看>>
函数指针的使用
查看>>
位图数据结构的操作
查看>>
azkaban用户管理及权限配置
查看>>
GCD学习笔记
查看>>
PHP......会话控制SESSION与COOKIE
查看>>
[转]AchartEngineActivity引擎绘制柱状图、曲线图
查看>>
[转]javascript实现限制上传文件的大小
查看>>
我的Java设计模式-策略模式
查看>>
C# 报表接口样例,简单实用
查看>>
C++常见内存错误及解决方案
查看>>
控制台应用程序窗口无法输入汉字解决办法
查看>>
Java中实现String.padLeft和String.padRight
查看>>
winCVS 使用的一个小要点
查看>>
一个关于session的问题
查看>>
加快开发时间的8个CSS的预处理程序
查看>>
dom元素高度、屏幕高度 获取
查看>>