c#写一个socket异步服务器

使用c#进行win窗体制作,实现一个sever,可以进行接受消息,发送消息。界面如下图所示:

 通过点击startWatching开始监听,首先使用代码创建一个Socket监听对象,给定ip地址和端口号,绑定端口号,指定最大连接数,开始监听,代码如下:

            //创建一个监听对象
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
                                      ProtocolType.Tcp);
            //创建ip地址
            IPAddress ip = IPAddress.Parse(textBox1.Text);
            //创建端口号
            IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(textBox2.Text));
            //绑定端口号
            socketWatch.Bind(endPoint);
            showMsg("开始监听\r\n");
            //最大连接数
            socketWatch.Listen(10);
            socketWatch.BeginAccept(GotClientCallback, socketWatch);

注意,这里使用的是异步方法监听,有client连接之后就会跳转到指定的回调函数 GotClientCallback(),在回调函数里需要调用异步方法开始接受消息,并且在接收消息代码之后要再一次开始监听,这样才能实现多个Client连接到服务器。参考代码如下: 

     socketwork.m_socket.BeginReceive(socketwork.recBuffer, 0, ConnectClients.buffersize, 
                                        SocketFlags.None,ReceMsg, socketwork);
     socketWatch.BeginAccept(GotClientCallback, socketWatch);

对接受的消息进行处理,在ReceMsg()回调函数里,回调函数最后需要再一次调用BeginReceive函数,才能接收到后续信息。 

       private void ReceMsg(IAsyncResult async)
        {
            try
            {
                ConnectClients ws = (ConnectClients)async.AsyncState;
                int r = ws.m_socket.EndReceive(async);
                string ip = comboBox1.SelectedItem.ToString();//获取ip地址
                if (r <= 0)
                {
                    ws.m_socket.Close();
                    showMsg(ws.m_socket.RemoteEndPoint.ToString() + ":断开连接\r\n");
                }
                else
                {
                    showMsg(ws.m_socket.RemoteEndPoint.ToString() + ":" +                             
                            Encoding.UTF8.GetString(ws.recBuffer, 0, r) + "\r\n");
                }
            }
            catch
            {
            }
        }

对多个client进行管理,可以使用 工具箱中可以下拉的列表控件存储多个client的IP地址和端口号,代码里使用字典实现。参考代码如下:

            //创建一个字典,使ip地址和socket对应,可以通过ip地址找到要通信的client
            DicClient.Add(s.RemoteEndPoint.ToString(), s);
            //将新连接的client的IP地址放到选择框中
            comboBox1.Items.Add(s.RemoteEndPoint.ToString());
            comboBox1.Text = s.RemoteEndPoint.ToString();

sever点击send控。件实现发送消息功能,具体实现为拿到创建的socket,调用socket.send()函数。

            try
            {
                byte[] sendMsg = new byte[2];
                sendMsg[0] = 01;
                sendMsg[1] = 02;
                DicClient[comboBox1.Text].Send(sendMsg);
            }
            catch 
            {
            }

sever创建完毕之后,可以使用telnet 或者 网络调试助手 调试是否收发正常。

欢迎大佬批评指正。

reference:

【01_C#入门到精通】新手强烈推荐:C#开发课程,一整套课程_哔哩哔哩_bilibili

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值