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; }
/// <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; }