C#TCP消息接收与发送

public delegate void ShowData(string msg);//委托,防止跨线程访问控件,引起安全异常
        public delegate void EnableButtonDelegate(Control control,bool enable);
        private const int bufferSize = 8000;//缓存空间

        private void EnableButton(Control control,bool enable)
        {
            if (control.InvokeRequired)
            {
                //使用委托
                control.Invoke(new EnableButtonDelegate((ct, eb) => { ct.Enabled = eb; }),new object[]{control,enable});
            }
            else
            {
                control.Enabled = enable;
            }
        }

        private TcpClient client;
        private TcpListener server;
        ///


        /// 结构体 IP 和端口
        ///

        struct IpAndPort
        {
            public string ip;
            public string port;
        }
        ///
        /// 侦听客户端连接并接收客户端发送的消息
        ///

        ///
        public void reciveAndListener(object ipAndPort)
        {
            IpAndPort ipHePort = (IpAndPort)ipAndPort;
            IPAddress ip = IPAddress.Parse(ipHePort.ip);
            server = new TcpListener(ip, int.Parse(ipHePort.port));
            server.Start();
            //Dispatcher
            rtbtxtShowData.Invoke(new ShowData(rtbtxtShowData.AppendText), "侦听启用成功...");
            //禁用btnStart按钮
            EnableButton(btnStart, false);
            //获得连接的客户端对象
            client = server.AcceptTcpClient();
            rtbtxtShowData.Invoke(new ShowData(rtbtxtShowData.AppendText), "有客户端请求连接,连接已建立...");
            //获得流
            NetworkStream reciveStream = client.GetStream();
            #region 循环监听客户端发来的消息
            do
            {
                byte[] buffer = new byte[bufferSize];
                int msgSize;
                try
                {
                    lock (reciveStream)
                    {
                        msgSize = reciveStream.Read(buffer, 0, bufferSize);
                    }
                    if (msgSize == 0)
                    {
                        return;
                    }
                    string msg = Encoding.Default.GetString(buffer, 0, bufferSize);
                    rtbtxtShowData.Invoke(new ShowData(rtbtxtShowData.AppendText), "\n" + msg);
                }
                catch (Exception)
                {
                    rtbtxtShowData.Invoke(new ShowData(rtbtxtShowData.AppendText), "\n 出现异常:连接被迫关闭");
                    break;
                }
            } while (true);
            #endregion
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(reciveAndListener);
            IpAndPort ipHePort = new IpAndPort();
            ipHePort.ip = "127.0.0.1";
            ipHePort.port = "10001";
            thread.Start((Object)ipHePort);
        }
        ///


        /// 发送消息
        ///

        ///
        ///
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (txtMsg.Text.Trim() == "")
            {
                MessageBox.Show("请输入要发送的内容", "温馨提示",  MessageBoxButtons.OK,MessageBoxIcon.Information);
                return;
            }
            else
            {
                try
                {
                    NetworkStream stream = client.GetStream();
                    byte[] buffer = Encoding.Default.GetBytes(txtMsg.Text.Trim());//将数据保存到缓存中
                    stream.Write(buffer, 0, buffer.Length);//最终写入流中
                    txtMsg.Text = "";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
               
            }
        }

你可能感兴趣的:(C#,TCP)