C#网络编程客户端(TcpClient)服务端(TcpListener)实现聊天通信

效果如图:
在这里插入图片描述
源码下载

服务端主要通过TcpListener类的Start方法监听,通过Acceptsocket方法来接收请求信息。

下面分别给出三个按钮的代码:
服务器 开始监听代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            try
            {    
                //在指定端口上侦听
                listenner = new TcpListener(Int32.Parse(this.textBox1.Text));
                //开始侦听
                listenner.Start();
                this.toolStripStatusLabel1.Text = "现在处于待机状态.....";
                //用线程接收是否有用户连接
                Thread thread = new Thread(()=>{


                    while (true)
                    {
                        try
                        {
                            // 接受挂起的连接请求。  返回接收到的数据  Socket    AcceptSocket()一定要写在循环里面,不然客户断开连接  就连接不上了
                            mysocket = listenner.AcceptSocket();
                            //如果接收到最近的请求   就返回true
                            if (mysocket.Connected)
                            {
                                this.toolStripStatusLabel1.Text = "和客户建立连接....";

                                //再开个线程专门用来接收消息
                                Thread thread1 = new Thread(()=> {
                                    //接收客户发来的消息
                                    while (!control)
                                    {
                                        try
                                        {
                                            //通过网络流的形式接收客户发来的数据 
                                            netstraem = new NetworkStream(mysocket);
                                            byte[] messageByte = new byte[64];
                                            //采用同步读取消息方式
                                            netstraem.Read(messageByte, 0, messageByte.Length);
                                            string ReadMessage = Encoding.BigEndianUnicode.GetString(messageByte);
                                            this.textBox2.AppendText(ReadMessage + "\r\n");
                                        }
                                        catch (Exception)
                                        {

                                            Console.WriteLine("连接断开,套接字为空");
                                        }
                                       
                                    }


                                });

                                thread1.Start();

                            }

                        }
                        catch (Exception)
                        {

                            Console.WriteLine("SOCKET断开连接....");
                        }
                    }

                     
                    

         
                

                });
                //启动线程
                thread.Start();

            }
            catch (Exception ee)
            {

                MessageBox.Show(ee.Message);
            }
        }

发送消息代码:

 private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                netstraem = new NetworkStream(mysocket);
                string send = this.textBox4.Text + ">>>>" + this.textBox3.Text+"\r\n";
                byte[] bytedate = Encoding.BigEndianUnicode.GetBytes(send);
                netstraem.Write(bytedate, 0, bytedate.Length);
                //刷新缓存
                netstraem.Flush();
            }
            catch (Exception)
            {
                MessageBox.Show("未建立连接发送失败!");
            }
         

        }

关闭代码:

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (mysocket==null)
                {
                    this.toolStripStatusLabel1.Text = "监听已关闭....";
                    listenner.Stop();
                }
                else
                {
                    mysocket.Close();
                    listenner.Stop();
                    this.toolStripStatusLabel1.Text = "监听已关闭....";
                }
            
               
            }
            catch (Exception ee)
            {

                Console.WriteLine(ee.Message);
            }
        }

如果想监听客户端是否断开连接,可以单独开一个线程进行检查
代码如下:

 private void 服务器_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            Thread t = new Thread(() => {
                while (true)
                {
                    try
                    {
                        if (mysocket == null) continue;
                        //检查客户端是否断开连接  第一个参数未负数  表示会一直检查。
                        if (mysocket.Poll(-1, SelectMode.SelectRead))
                        {
                            this.toolStripStatusLabel1.Text = "客户端断开连接....";
                        }
                    }
                    catch (Exception)
                    {

                        Console.WriteLine("连接已经关闭!");
                    }
                
                }
            
            });
            t.Start();

        }

接着是客户端:
客户端主要使用TcpClient类的TcpClient方法进行连接和Connect方法
我用的Connect

代码如下:
连接按钮

    private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                int port = Int32.Parse(this.textBox5.Text);
                client=new TcpClient();
                client.Connect(textBox1.Text,port);
                this.toolStripStatusLabel1.Text = "可通话!";
                Thread thread = new Thread(()=> {
                    //接收消息
                    while (!control)
                    {
                        try
                        {
                            //     返回用于发送和接收数据的
                            netstrcam = client.GetStream();
                            byte[] messageByte = new byte[64];
                            netstrcam.Read(messageByte, 0, messageByte.Length);
                            string readNessage = Encoding.BigEndianUnicode.GetString(messageByte);
                            this.textBox2.AppendText(readNessage + "\r\n");
                        }
                        catch (Exception)
                        {

                            Console.WriteLine("连接断开....");
                        }
                     

                    }


                });

                thread.Start();


            }
            catch (Exception)
            {

                MessageBox.Show("无法连接!");
            }
        }

发送按钮 和 关闭按钮和上面服务端代码类似。这里就不发了
上面代码都是同步模式下的开发。
异步模式下的开发和我之前写的Socket方式是一样的,异步开发~~~~~点我=====

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值