Thread threadWatch = null; // 负责监听客户端连接请求的 线程; #endregion Fields #region Methods // 发送消息 public void btnSend(object sender, string ip, MyMessage Mmsg) { string strMsg = "服务器 -->" + Mmsg.msg ; byte[] arrMsg = Encoding.UTF8.GetBytes(JsonHelper.ToJson(Mmsg)); string strKey = ""; for (int i = 0; i < dictip.Count; i++) { if (dictip[i].ip == ip) strKey = dictip[i].StrRemoteEndPoint; } if (string.IsNullOrEmpty(strKey)) // 判断是不是选择了发送的对象; { md.DoShowMSGFunc(sender, "请选择你要发送的Ip!!!"); } else { dict[strKey].Send(arrMsg);// 解决了 sokConnection是局部变量,不能再本函数中引用的问题; md.DoShowMSGFunc(sender, strMsg); } }
void RecMsg(object a) { object[] aa = (object[])a; Socket sokClient = aa[0] as Socket; object sender = (object)aa[1]; while (true) { // 定义一个2M的缓存区; byte[] arrMsgRec = new byte[1024 * 1024 * 2]; // 将接受到的数据存入到输入 arrMsgRec中; int length = -1; try { length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; } catch (SocketException se) { md.DoShowMSGFunc(aa[1], "异常:" + se.Message); // 从 通信套接字 集合中删除被中断连接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString()); // 从通信线程集合中删除被中断连接的通信线程对象; dictThread.Remove(sokClient.RemoteEndPoint.ToString()); // 从列表中移除被中断的连接IP for (int i = 0; i < dictip.Count; i++) { if (dictip[i].StrRemoteEndPoint == sokClient.RemoteEndPoint.ToString()) { dictip.RemoveAt(i); } } //dictip.RemoveAt(sokClient.RemoteEndPoint.ToString()); break; } catch (Exception e) { md.DoShowMSGFunc(sender, "异常:" + e.Message); // 从 通信套接字 集合中删除被中断连接的通信套接字; dict.Remove(sokClient.RemoteEndPoint.ToString()); // 从通信线程集合中删除被中断连接的通信线程对象; dictThread.Remove(sokClient.RemoteEndPoint.ToString()); // 从列表中移除被中断的连接IP dict.Remove(sokClient.RemoteEndPoint.ToString()); break; } MyMessage mmsg = new MyMessage(); mmsg = JsonHelper.DeserializeJsonToObject<MyMessage>(Encoding.UTF8.GetString(arrMsgRec)); // 将接受到的数据存入到输入 arrMsgRec中; if (mmsg == null) { md.DoShowMSGFunc(sender, "异常:没有获取到数据"); return; } if (mmsg.id == "0") // 表示接收到的是消息数据; { string sip = sokClient.RemoteEndPoint.ToString(); md.DoShowMSGFunc(sender, sip.Substring(0, sip.IndexOf(":")) + ":" + mmsg.msg); } //if (arrMsgRec[0] == 1) // 表示接收到的是文件; //{ // SaveFileDialog sfd = new SaveFileDialog(); // if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) // {// 在上边的 sfd.ShowDialog() 的括号里边一定要加上 this 否则就不会弹出 另存为 的对话框,而弹出的是本类的其他窗口,,这个一定要注意!!!【解释:加了this的sfd.ShowDialog(this),“另存为”窗口的指针才能被SaveFileDialog的对象调用,若不加thisSaveFileDialog 的对象调用的是本类的其他窗口了,当然不弹出“另存为”窗口。】 // string fileSavePath = sfd.FileName;// 获得文件保存的路径; // // 创建文件流,然后根据路径创建文件; // using (FileStream fs = new FileStream(fileSavePath, FileMode.Create)) // { // fs.Write(arrMsgRec, 1, length - 1); // ShowMsg("文件保存成功:" + fileSavePath); // } // } //} } }