C#网络编程之同步模式下的套接字(Socket)服务器和客户端(聊天工具)开发

先看实现效果:
在这里插入图片描述

→→→点我下载源码←←←

简单说一下实现的思路,
一.服务器开发思路
1.先实例化一个主机,当服务器。
2.创建套接字通信
3.绑定主机
4.启动监听
5. accsock = sock.Accept(); 等待客户端连接。同步模式下 如果客户端未连接将不会执行后面代码。
6. 如果客户端连接,那么就可以进行通信
7. 通信分为发送消息和接收消息
8. 断开连接
1-6的代码如下:

  private void accp()
        {   
            //创建一个主机
            myserver = new IPEndPoint(myip, Int32.Parse(textBox2.Text));
            //创建套接字
            sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //绑定主机
            sock.Bind(myserver);
            //监听
            sock.Listen(50);
            listBox1.Items.Add("主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听.......\r\n");
           
            while (true)
            {
                try
                {
                    //接收连接请求   同步模式下会一只等待客户端链接。只到有用户链接才会执行后面的代码。
                    accsock = sock.Accept();
                }
                catch (Exception)
                {

                    this.listBox1.Items.Add("服务器已关闭!!\r\n");
                    break;
                }
               

                if (accsock.Connected)
                {
                    listBox1.Items.Add("与客户建立连接。");
                    theeadround = new Thread(new ThreadStart(round));
                    theeadround.Start();
                }
            }


        }

7的代码如下:
7.1接收消息的代码(接收消息为了方便 另外开启了子线程可以一直接用来收消息)

  private void round()
        {
            while (check)
            {
                try
                {
                    if (accsock.Available <= 0) continue;
                    Byte[] rec = new Byte[64];
                    //用网络流的形式读取
                    NetworkStream netsream = new NetworkStream(accsock);
                    netsream.Read(rec, 0, rec.Length);
                    string recmessage = Encoding.BigEndianUnicode.GetString(rec);
                    this.textBox3.AppendText(recmessage + "\r\n") ;

                }
                catch (Exception ee)
                {

                    MessageBox.Show(ee.Message);
                }
               

            }
        }

7.2发送消息的代码如下(和接收消息代码同理)

  try
            {
                Byte[] sendByte = new Byte[64];
                string send = this.textBox4.Text+"\r\n";
                //用网络流的形式发送
                NetworkStream netstream = new NetworkStream(accsock);
                sendByte = Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());
                netstream.Write(sendByte, 0, sendByte.Length);
                //刷新缓存
                netstream.Flush();

            }
            catch (Exception)
            {

                MessageBox.Show("链接未建立,无法发送!");
            }

8.的代码如下:

 try
            {
                
                //关闭主机
                sock.Close();
                //中止子线程
                threadaccp.Abort();
                theeadround.Abort();
                this.listBox1.Items.Add("主机"+this.textBox1.Text+"端口"+textBox2.Text+"停止监听!\r\n");

            }
            catch (Exception)
            {

                MessageBox.Show("监听未开始,关闭无效!");
            }

其中遇到的线程问题,因为子线程不能调用主线程中的控件,在Load的时候加入一下代码就解决了跨线程问题:

  //取消对跨线程的检查
            Control.CheckForIllegalCrossThreadCalls = false;

如果子线程开启太多,关闭主线程后有可能关不干净,可以在关闭窗体事件里面加如下代码:

  //不管什么线程全部退出
            System.Environment.Exit(0);

接着说一下客户端的思路,思路大致和服务端一样。
主要用到了Socket的Connect()方法,此方法是和服务器建立连接的方法。
客户端实现具体核心代码如下:
建立连接的代码:

  try
            {
                //实例化主机
                myserver = new IPEndPoint(myip, Int32.Parse(this.textBox2.Text));
                //创建套接字
                conncctsock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
                //和指定的服务器连接
                conncctsock.Connect(myserver);
                this.listBox1.Items.Add("与主机"+this.textBox1.Text+"端口"+this.textBox2.Text+"连接成功!\r\n");
                threadreceive = new Thread(new ThreadStart(receive));
                threadreceive.Start();
            }
            catch (Exception ee)
            {

                MessageBox.Show(ee.Message);
            }

接收消息和发送消息还有关闭连接实现思路和服务器开发一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值