C#-多线程和Socket网络编程-全网最细模拟服务器和客户端通信

本文详细介绍如何使用C#创建TCP服务器,包括监听设置、客户端连接处理及多线程管理等内容,帮助读者理解服务器与客户端通信的基本原理。

模拟服务器和客户端通信

😍全网最细-保姆级教程😍那就不多说了开始✨

  1. 创建一个负责监听的Socket
  2. 创建IP地址和端口号对象
  3. 让负责监听的socket绑定IP地址和端口号
  4. 设置监听队列 就是在某一时间点能够连入客户端最大的数量 到达这个限度就要排队了
  5. 负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket

难点在于:

负责监听的socket 来接受客户端的连接 创建和客户端通信的Socket
但是一个语句只能建立一次链接 并且他是主线程在执行 一旦执行起来没人连窗口就会假死
所以说我们得把后边这一句话开新线程 并放到一个循环里 Socket socketSend = socketWatch.Accept();
在循环里还有一个难题:
在方法找不到socketWatch 我们需要把他当作一个参数传进来
但是我们要开辟新线程 被线程执行的函数 如果要传参就必须传Object类型的参数
我们可以传完参数我们再把它强转回来就可以了

展示成果图片:

在这里插入图片描述
源码展示:

private void button1_Click(object sender, EventArgs e)
        {
            //创建一个负责监听的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //创建IP地址和端口号对象
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
            //让负责监听的socket绑定IP地址和端口号
            socketWatch.Bind(point);
            ShowMsg("监听成功");

            //设置监听队列   就是在某一时间点能够连入客户端最大的数量 到达这个限度就要排队了
            socketWatch.Listen(10);
            //负责监听的socket  来接受客户端的连接 创建和客户端通信的Socket
            //但是一个语句只能建立一次链接 并且他是主线程在执行 一旦执行起来没人连窗口就会假死
            //所以说我们得把后边这一句话开新线程 并放到一个循环里  Socket socketSend = socketWatch.Accept();

            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);
        }
        /// <summary>
        /// 等待客户端的连接 并且创建与之通信的socket
        /// </summary>
        void Listen(object o) {
            //负责监听的socket  来接受客户端的连接 创建和客户端通信的Socket 
            //但是在方法找不到socketWatch   把他当作一个参数传进来
            //但是我们要开辟新线程 被线程执行的函数 如果要传参就必须传Object类型的参数
            //传完参数我们再把它强转回来就可以了
            Socket socketWatch = o as Socket;
            //as  类型转换 转换成功返回对象 转换不成功一个null
            while (true)
            {
                Socket socketSend = socketWatch.Accept();
                ShowMsg(socketSend.RemoteEndPoint.ToString() + "链接成功");
            }
        }
        void ShowMsg(string str) {
            txtLog.AppendText(str+"\r\n");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

如果有写的不好的地方还请大家指正。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码校准师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值