C# Socket 服务器客户端通信(二)服务器端程序

在这里插入图片描述


```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TCPServer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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

        //TCP服务器程序
        //用线程方式调用
        public int serverPort;
        public Socket ServerSocket;
        public IPEndPoint localEp;

        //1开启客户端连接
        public void Listen()//监听函数
        {

            //监听 Rod Motor客户端
            int setPort = 33;
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化socket实例,IP4寻址协议,流式连接,TCP协议
            ServerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//允许socket绑定在已使用的地址上
            localEp = new IPEndPoint(IPAddress.Any, setPort);//侦听本机所有ip对应的那个端口(本机可能有多个ip或只有一个ip)
            try
            {

                ServerSocket.Bind(localEp);//绑定
                ServerSocket.Listen(10);//监听,最多监听10个
                ServerSocket.BeginAccept(new AsyncCallback(serverConnectRequest), ServerSocket);//开始接受连接,异步
                                                                                                //Thread thread_rec=new Thread(new ThreadStart(serverConnectRequest));
                btn_start.Text = "服务器已开启";
                btn_start.Enabled = false;
            }
            catch (Exception ex)
            {

                //MessageBox.Show(ex.Message, "监听报错");
            }
        }

        //2服务器接收客户端信息
        public Socket server1, client1;
        //定义一个集合,存储客户端信息
        Dictionary<string, Socket> dic = new Dictionary<string, Socket> { };

        public void serverConnectRequest(IAsyncResult ar)
        {

            try
            {
                server1 = (Socket)ar.AsyncState;//初始化一个SOCKET,用于其它客户端的连接
                client1 = server1.EndAccept(ar); //服务器接收一个连接请求
                string strDateLine = "欢迎登录到服务器";
                Byte[] byteDateLine = System.Text.Encoding.UTF8.GetBytes(strDateLine);//将要发送给连接上来的客户端的提示字符串
                EndPoint remote = client1.RemoteEndPoint;//将提示信息发送给客户端,并在服务端显示连接信息。
                client1.Send(byteDateLine, byteDateLine.Length, 0);
                string client1IP = client1.RemoteEndPoint.ToString();

                //
                dic.Add(client1IP, client1);
                listBoxOnlineList.Items.Add(client1IP);

                server1.BeginAccept(new AsyncCallback(serverConnectRequest), server1); //等待新的客户端连接
                while (true)
                {
                    int recv = client1.Receive(byteDateLine);//收到的字符数
                    string stringdata = Encoding.UTF8.GetString(byteDateLine, 0, recv);

                    rtb_rec.Text = stringdata;
                    string ip = client1.RemoteEndPoint.ToString();//获取客户端的IP和端口
                    if (stringdata == "STOP")
                    {
                        //当客户端终止连接
                        MessageBox.Show(ip + "   " + "已从服务器断开","发来stop");
                        //sessionTable.Remove(client1.RemoteEndPoint);
                        listBoxOnlineList.Items.Remove(client1.RemoteEndPoint.ToString());
                        break;
                    }
                    //显示客户端发送过来的信息

                }
            }
            catch (Exception ex)
            {
                 MessageBox.Show(ex.Message,"客户端报错1");
            }


        }

        //服务器3发送内容
        public string selectClient;

        private void btn_start_Click(object sender, EventArgs e)
        {
            Listen();
        }

        private void btn_send_Click(object sender, EventArgs e)
        {
            sendBroadMsg();
        }

        public void sendBroadMsg()
        {

            try
            {

                string sendMsg1 = rtb_send.Text ;
                byte[] sendData = Encoding.UTF8.GetBytes(sendMsg1);

                //同时发送给不同的客户端
                for (int i = 0; i < listBoxOnlineList.Items.Count; i++)
                {
                    selectClient = listBoxOnlineList.Items[i].ToString();  //选择要发送的客户端
                    dic[selectClient].Send(sendData);


                }

                //richTextBox1.Text = bb.ToString();

            }
            catch (Exception)
            {

                // MessageBox.Show(ex.Message+"\r\n"+selectClient+"断开连接", "服务器发送报错");
                listBoxOnlineList.Items.Remove(selectClient);

            }


        }





    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值