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_Connect_Click(object sender, EventArgs e) { if (socketClient != null) { MessageBox.Show($"连接已存在!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //连接 try { //获取网络终结点及Socket对象 IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(Txt_ServerIP.Text), int.Parse(Txt_ServerPort.Text)); socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Txt_RecInfo.AppendText("连接中..." + Environment.NewLine); socketClient.Connect(iPEndPoint); } catch (Exception ex) { Txt_RecInfo.AddInfo($"连接失败。{ex.Message}"); socketClient = null; return; } Txt_RecInfo.AddInfo("连接成功!"); //连接成功,开启线程-监听消息 Thread thread = new Thread((sc) => { Socket sClient = sc as Socket; //定义一个数据缓冲区 byte[] arrMsgRec = null; //接受客户端数据 int len = -1; while (true) { arrMsgRec = new byte[Const.BufferByteSize]; try { len = sClient.Receive(arrMsgRec); } catch (Exception) { break; } if (len > 1) { string recvMsg = Encoding.Default.GetString(arrMsgRec, 1, len - 1); if (arrMsgRec[0] == 0) { Txt_RecInfo.AddInfo($"{sClient.RemoteEndPoint.ToString()}:{recvMsg}"); } else if (arrMsgRec[0] == 1) { string res = "接受到文件,拒绝保存"; if (MessageBox.Show("接受到文件,是否保存?", "接收到文件", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Invoke(new Action <byte[]>(arrMsg => { //保存文件 SaveFileDialog saveFileDialog = new SaveFileDialog(); if (saveFileDialog.ShowDialog() == DialogResult.OK) { string path = saveFileDialog.FileName; using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Write(arrMsg, 1, arrMsg.Length - 1); res = $"接收到文件,保存在{path}目录"; } } }), arrMsgRec); } Txt_RecInfo.AddInfo(res); } } } }) { IsBackground = true }; thread.Start(socketClient); }
/// <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; }