Exemplo n.º 1
0
        private static CancellationTokenSource TokenSource = null;  //停止任务标记

        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Start_Click(object sender, EventArgs e)
        {
            if (socketSvr != null)
            {
                MessageBox.Show("服务已存在,无需再次启动");
                return;
            }

            //创建当前服务端中负责监听的套接字
            socketSvr = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


            //根据ip及port创建IP终结点对象
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(Txt_LocalIP.Text), int.Parse(Txt_LocalPort.Text));

            try
            {
                //尝试将Socket绑定该终结点
                socketSvr.Bind(iPEndPoint);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"开启服务失败,错误原因:{ex.Message}");
                socketSvr = null;
                return;
            }

            //最大监听数
            socketSvr.Listen(10);

            //开启任务-监听
            //任务类型[LongRunning]
            TokenSource = new CancellationTokenSource();
            TokenSource.Token.Register(() =>
            {
                if (socketSvr == null)
                {
                    MessageBox.Show("你关闭了服务");
                }
            });
            Task Task_Listening = Task.Factory.StartNew(() =>
            {
                while (!TokenSource.IsCancellationRequested)
                {
                    //如果监听到一个连接,则新建一个对象的socket
                    Socket sClient = socketSvr.Accept();

                    //获取该socket的终结点
                    string clientIP = sClient.RemoteEndPoint.ToString();

                    //添加到字典
                    //SClientDic.Add(clientIP, sClient);
                    sockets.Add(sClient);

                    //显示连接信息
                    Lb_OnlineList.RefrshItem(clientIP, true);
                    Txt_RecInfo.AddInfo($"{clientIP}上线");


                    //开启新任务-监听已连接的通讯
                    Task Task_ListenMsg = Task.Factory.StartNew(scip =>
                    {
                        //Socket scobj = SClientDic[scip.ToString()];
                        Socket scobj = scip as Socket;
                        while (!TokenSource.IsCancellationRequested)
                        {
                            //数据缓冲区
                            byte[] arrMsg = new byte[1024 * 1024 * 2];

                            //获取数据
                            int len = -1;
                            try
                            {
                                len = scobj.Receive(arrMsg);
                            }
                            catch (SocketException)
                            {
                                //主机断开连接
                                Lb_OnlineList.RefrshItem(scobj.RemoteEndPoint.ToString(), false);
                                Txt_RecInfo.AddInfo($"{scobj.RemoteEndPoint}离线");
                                break;
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show($"出错,{ex.Message}");
                                break;
                            }

                            if (len > 0)
                            {
                                Txt_RecInfo.AddInfo($"来自{scobj.RemoteEndPoint}的消息:{Encoding.Default.GetString(arrMsg, 0, len)}");
                            }
                            else
                            {
                                //主机断开连接
                                Lb_OnlineList.RefrshItem(scobj.RemoteEndPoint.ToString(), false);
                                Txt_RecInfo.AddInfo($"{scobj.RemoteEndPoint}离线");
                                break;
                            }
                        }
                    }, sClient);
                }
            }, TokenSource.Token);

            Btn_Start.Enabled = false;
        }
Exemplo n.º 2
0
        /// <summary>
        /// 打开服务
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Start_Click(object sender, EventArgs e)
        {
            if (socket != null)
            {
                MessageBox.Show($"连接已存在!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                //创建负责监听的套接字
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                //根据IP地址转为IPAddress对象
                IPAddress iPAddress = IPAddress.Parse(Txt_LocalIP.Text.Trim());

                //根据IPAddress以及端口号创建IPE对象
                IPEndPoint endPoint = new IPEndPoint(iPAddress, int.Parse(Txt_LocalPort.Text));

                socket.Bind(endPoint);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"开始服务失败,错误信息:{ex.Message}");
                throw;
            }

            socket.Listen(2);

            //开启线程-监听对象端口
            SvrThread = new Thread(() =>
            {
                while (true)
                {
                    //如果监听到一个客户端,则新建一个对应的Socket
                    Socket socketClient = socket.Accept();

                    //添加到Clients字典
                    Clients.Add(socketClient.RemoteEndPoint.ToString(), socketClient);

                    //显示连接信息
                    Lb_OnlineList.RefrshInfo(socketClient.RemoteEndPoint.ToString(), true);
                    Txt_RecInfo.AddInfo($"{socketClient.RemoteEndPoint}上线");

                    //开启线程-监听已连接的通讯
                    Thread threadMsg = new Thread((sc) =>
                    {
                        Socket sclient = sc as Socket;
                        while (true)
                        {
                            //定义一个缓冲区-用于接收数据
                            byte[] arrMsgRec = new byte[Const.BufferByteSize];

                            //根据收到返回的字节数判断是否连接断开
                            int len = -1;
                            try
                            {
                                len = sclient.Receive(arrMsgRec);
                            }
                            catch (SocketException)
                            {
                                Lb_OnlineList.RefrshInfo(sclient.RemoteEndPoint.ToString(), false);
                                Txt_RecInfo.AddInfo($"{sclient.RemoteEndPoint}离线");
                                break;
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show($"出错:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                break;
                            }

                            if (len > 0)
                            {
                                //传输数据
                                Txt_RecInfo.AddInfo($"{sclient.RemoteEndPoint}:{Encoding.Default.GetString(arrMsgRec, 0, len)}");
                            }
                        }
                    })
                    {
                        IsBackground = true
                    };
                    threadMsg.Start(socketClient);
                }
            })
            {
                IsBackground = true
            };
            SvrThread.Start();

            Btn_Start.Enabled = false;
        }