记笔记:C# Socket客户端监听服务器端处理方案【同步】

方案主要功能:

       (1)客户端同步监听来自服务器端的数据(开启子线程监听)

       (2)客户端向服务器端发送数据(主线程发送,并控制)

       (3)IsOnline判断连接是否中断,如中断则子线程结束执行


        TcpClient tcpClient;
        NetworkStream ns;
        Thread receiveThread;
        /// <summary>
        /// 网络连接
        /// </summary>
        private void client()
        {
            tcpClient = new TcpClient();  //创建一个TcpClient对象,自动分配主机IP地址和端口号
            string ipaddr = this.IpAddress.Text;
            int port = Int32.Parse(this.Port.Text);
            //MessageBox.Show(ipaddr);
            try
            {
                //发起TCP连接  
                tcpClient.Connect(ipaddr, port);
                if (tcpClient != null)
                {
                    MessageBox.Show("连接服务器成功");
                    this.button1.Text = "关闭连接";
                    //获得绑定的网络数据流  
                    ns = tcpClient.GetStream();
                    Control.CheckForIllegalCrossThreadCalls = false;
                    //实例化并启动接受消息线程  
                    receiveThread = new Thread(receive_message);
                    receiveThread.Start();
                    string mestext = "hello world!";
                    send_message(mestext);
                    connectFlag = true;
                    modeChangeInit();
                }
                else
                {
                    MessageBox.Show("连接服务器失败");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }


        /// <summary>
        ///  检测TCP连接是否存在还是已经中断
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public bool IsOnline(TcpClient c)
        {
            return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
        }
        //接收消息
        private void receive_message()
        {
            revWrong = 0;
            while (IsOnline(tcpClient))
            {
                try
                {
                    //创建接收数据的字节流  
                    byte[] getData = new byte[1024];
                    //从网络流中读取数据  
                    ns.Read(getData, 0, getData.Length);
                    //将字节数组转换成文本形式  
                    string getMsg = Encoding.Default.GetString(getData);
                    string msgStr = getMsg.Trim('\0');
                    if (!string.IsNullOrEmpty(msgStr))
                        processMsgInShow(msgStr);
                }
                catch (ThreadAbortException)
                {
                    //捕捉到线程被终止异常则表示是人为的断开TCP连接  
                    //不弹出错误提示
                    break;
                }
                catch (Exception e)
                {
                    //接受消息发生异常  
                    MessageBox.Show(e.Message);
                    //并释放相关资源  
                    if (ns != null)
                        ns.Dispose();
                    break;


                }
            }
            MessageBox.Show("网络中断");
            /// 当接收中断时
            ///if (ns != null)
            ///    ns.Dispose();


        }
        // 发送指令
        private void send_order(commandType no, string mesg)
        {
            string str = ((int)no).ToString();
            string order = string.Format("*0{0};{1}#", str, mesg);
            send_message(order);
        }
        private void send_message(string messageText)
        {
            //将要发送的文本转换为字符数组形式  
            byte[] sendData = Encoding.Default.GetBytes(messageText);
            //将数据写入到网络数据流中  
            ns.Write(sendData, 0, sendData.Length);
        }
        //断开连接 
        private void disconnect()
        {
            //断开TCP连接  
            tcpClient.Close();
            //销毁绑定的网络数据流  
            ns.Dispose();
            //销毁接受消息的线程  
            receiveThread.Abort();
            //修改控件状态
            this.button1.Text = "连接";
            connectFlag = false;
            showMessage.Stop();
            // 删除时钟
            // showMessage.Dispose();
        }
        ///////////////////////////////////////////////////////////
        /// <summary>
        /// 网络连接
        /// </summary>
        private void client()
        {
            tcpClient = new TcpClient();  //创建一个TcpClient对象,自动分配主机IP地址和端口号
            string ipaddr = this.IpAddress.Text;
            int port = Int32.Parse(this.Port.Text);
            //MessageBox.Show(ipaddr);
            try
            {
                //发起TCP连接  
                tcpClient.Connect(ipaddr, port);
                if (tcpClient != null)
                {
                    MessageBox.Show("连接服务器成功");
                    this.button1.Text = "关闭连接";
                    //获得绑定的网络数据流  
                    ns = tcpClient.GetStream();
                    Control.CheckForIllegalCrossThreadCalls = false;
                    //实例化并启动接受消息线程  
                    receiveThread = new Thread(receive_message);
                    receiveThread.Start();
                    string mestext = "hello world!";
                    send_message(mestext);
                    connectFlag = true;
                }
                else
                {
                    MessageBox.Show("连接服务器失败");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        /// <summary>
        ///  检测TCP连接是否存在还是已经中断
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        public bool IsOnline(TcpClient c)
        {
            return !((c.Client.Poll(1000, SelectMode.SelectRead) && (c.Client.Available == 0)) || !c.Client.Connected);
        }
        //接收消息
        private void receive_message()
        {
            revWrong = 0;
            while (IsOnline(tcpClient))
            {
                try
                {
                    //创建接收数据的字节流  
                    byte[] getData = new byte[1024];
                    //从网络流中读取数据  
                    ns.Read(getData, 0, getData.Length);
                    //将字节数组转换成文本形式  
                    string getMsg = Encoding.Default.GetString(getData);
                    string msgStr = getMsg.Trim('\0');
                    if (!string.IsNullOrEmpty(msgStr))
                        processMsgInShow(msgStr);
                }
                catch (ThreadAbortException)
                {
                    //捕捉到线程被终止异常则表示是人为的断开TCP连接  
                    //不弹出错误提示
                    break;
                }
                catch (Exception e)
                {
                    //接受消息发生异常  
                    MessageBox.Show(e.Message);
                    //并释放相关资源  
                    if (ns != null)
                        ns.Dispose();
                    break;

                }
            }
            MessageBox.Show("连接中断");
        }
        // 发送指令
        private void send_message(string messageText)
        {
            //将要发送的文本转换为字符数组形式  
            byte[] sendData = Encoding.Default.GetBytes(messageText);
            //将数据写入到网络数据流中  
            ns.Write(sendData, 0, sendData.Length);
        }
        //断开连接 
        private void disconnect()
        {
            //断开TCP连接  
            tcpClient.Close();
            //销毁绑定的网络数据流  
            ns.Dispose();
            //销毁接受消息的线程  
            receiveThread.Abort();
            //修改控件状态
            this.button1.Text = "连接";
            connectFlag = false;
        }
        ///////////////////////////////////////////////////////////

参考文章(1):https://blog.csdn.net/godsight/article/details/60968437

参考文章(2):https://www.cnblogs.com/Lexy/p/3556924.html

猜你喜欢

转载自blog.csdn.net/ever_idea/article/details/80150862