C#Socket处理多个连接

来源:互联网 发布:字有几个字节知乎 编辑:程序博客网 时间:2024/06/06 18:17

Socket监听多个连接并进行处理]

思路:

1.创建一个Socket对象用于服务器监听客户端的连接

2.当有客户端连接上之后,新开一个线程为不停的去接受该连接发送的消息 并进行处理

3.服务端的Socket对象继续监听其他客户端的连接

4.服务器端每监听到一个连接,就创建一个线程为该连接进行处理 实现Socket监听多个连接

理解上面的思路 如果你对一定基础,应该就能自己写出来了...


代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace Socket服务器_updateVision{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            Control.CheckForIllegalCrossThreadCalls = false;//允许跨线程访问控件        }        private Socket _serverSocket;//Socket服务器        private Dictionary Dict_SocketList = new Dictionary();//用于存储已连接的客户端        private int count = 0; //用做Socket键值对的键        private void btn_startListen_Click(object sender, EventArgs e)        {            //一.开始监听客户端的连接            //1.Ip地址            IPAddress ip = IPAddress.Parse(txt_Ip.Text);            //2.端口号            int port = int.Parse(txt_port.Text);            //3.窗创建服务器的Socket对象            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //4.绑定IP地址和端口号            _serverSocket.Bind(new IPEndPoint(ip, port));            //5.设置监听数            _serverSocket.Listen(3939);            //6.新开一个线程去监听客户端连接            Thread threadListen = new Thread(StartListen);            threadListen.IsBackground = true;            threadListen.Start();            //二.如果客户端已连接上 则创建一个与之进行通信的Socket            //三.服务器继续监听连接        }        private void StartListen()        {            while (true)            {                //开始监听客户端连接                txt_log.AppendText("开始监听客户端连接"+"\r\n");                this.count++;                Socket Connect_Socket = _serverSocket.Accept();//开始监听                txt_log.AppendText("\r\n"+"客户端" + Connect_Socket.LocalEndPoint.ToString() + "已连接" + "\r\n");                Dict_SocketList.Add(count, Connect_Socket);//m                //将已有的Socket连接添加到ListBox列表中显示                for (int i = Dict_SocketList.Count; i <= Dict_SocketList.Count; i++)                {                    list_connect.Items.Add(Dict_SocketList[i].LocalEndPoint.ToString());                }                //监听连接完成后  新开一个线程与该客户端进行通信 然后服务器开始监听其他连接                Thread connectSocket = new Thread(new ParameterizedThreadStart(Communication));                connectSocket.Start(Connect_Socket);            }        }        ///         /// 开始接收客户端发送过来的数据        ///         ///         private void Communication(Object socket)        {            Socket connect = socket as Socket;//处理客户端连接的Socket对象            int len=0;            while (true)            {                //开始接收数据                Byte[] Receive_Msg = new byte[1024 * 1024];                //如果该连接正在 数据 而客户端已断开连接 会抛出一个异常                try                {                    //len表示接受到的数据长度                    len = connect.Receive(Receive_Msg, Receive_Msg.Length, SocketFlags.None);                }                catch (Exception)                {                    //将日志信息打印到文本框中                    txt_log.AppendText("\r\n"+connect.LocalEndPoint.ToString() + "已断开连接" + "\r\n");                    connect.Close();                    connect.Dispose();                    break;                }                if (len > 0)//说明已接收到数据                {                    //打印接受的消息到文本框中                    txt_log.AppendText("\r\n"+Encoding.Default.GetString(Receive_Msg, 0, Receive_Msg.Length)+"\r\n");                }            }        }    }}


:


客户端代码:

private static byte[] result;
        private static Socket clineSocket;
        private static byte[] msg;
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //初始化IP地址
            //ip = IPAddress.Parse(txt_ip.Text);
            //port = int.Parse(txt_port.Text);
        }


        private void btn_connce_Click(object sender, RoutedEventArgs e)
        {
            //创建一个与服务器通信的Socket
            clineSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clineSocket.Connect(new IPEndPoint(IPAddress.Parse(txt_ip.Text),int.Parse(txt_port.Text)));
            MessageBox.Show("连接成功!");
        }


        private void btn_send_Click(object sender, RoutedEventArgs e)
        {
            //获取文本框的消息
            msg=Encoding.Default.GetBytes(txt_msg.Text);
            clineSocket.Send(msg, 0, msg.Length,SocketFlags.None);
            txt_msg.Text = ""+"\n";
        }



原创粉丝点击