/// <summary> /// 收到一条数据 /// </summary> /// <param name="sender"></param> /// <param name="ea"></param> private void receiveOneEventHandler(object sender, EventArgs ea) { try { SocketAsyncEventArgs socketAsyncEA = (SocketAsyncEventArgs)ea; // 获取文本 string rcvString = Encoding.ASCII.GetString(socketAsyncEA.Buffer); ProtocalHandler protocalHandler = new ProtocalHandler(); // 判断是否是协议 protocalHandler.SetXmlText(rcvString); // 对方用户名 string targetNameBase64 = protocalHandler.GetElementTextByTag("name"); string targetName = protocalHandler.Base64stringToString(targetNameBase64); if (targetName == null) { throw new MyProtocalException( "不是有效协议," + "找不到name标签或无法解码"); } // 类型 string type = protocalHandler.GetElementTextByTag("type"); if (type == null) { throw new MyProtocalException( "不是有效的协议文本,找不到type标签"); } else { switch (type) { case "ctl_closesocket": // 对方要求关闭Socket closeSocketWithoutSend(); break; case "gp_rtf": // 收到聊天消息(RTF文本) string rtfText = protocalHandler.GetElementTextByTag("data"); if (rtfText == null) { throw new MyProtocalException( "不是有效的协议文本,type为gp_rtf但找不到data标签"); } rtfText = protocalHandler.Base64stringToString(rtfText); if (rtfText == null) { throw new MyProtocalException( "不是有效的协议文本,rtf文本解码错误"); } // 显示收到的消息 owner.BeginInvoke(owner.receiveRTFDelegate, new object[] { rtfText }); break; default: throw new MyProtocalException("type类型未知: " + type); } // End Switch } } catch (Exception ex) { Trace.WriteLine("异常位置:P2PGroupClient.receiveOneEventHandler"); Trace.WriteLine(ex.Message); } finally { // 继续接收数据 if (socket != null) { beginReceive(); } } }
/// <summary> /// 发起方: /// 收到2次确认,核对对方的身份信息 /// </summary> /// <param name="sender"></param> /// <param name="ea"></param> private void createSocketNameReceivedEventHandler( object sender, EventArgs ea) { try { SocketAsyncEventArgs socketAsyncEA = (SocketAsyncEventArgs)ea; // 获取文本 string rcvString = Encoding.ASCII.GetString(socketAsyncEA.Buffer); ProtocalHandler protocalHandler = new ProtocalHandler(main.MyName); // 判断是否是协议 if (!protocalHandler.SetXmlText(rcvString)) { throw new MyProtocalException( "不是有效的协议文本,找不到CSP2P标签"); } // 数据包类型 string type = protocalHandler.GetElementTextByTag("type"); if (type.Equals("closesocket")) // 对方要求关闭Socket { closeSocketWithoutSend(); } if (!type.Equals("init_gp_ok")) { throw new MyProtocalException( "不是有效的2次确认," + "找不到type标签或type不为init_gp_ok"); } // 对方用户名 string key = protocalHandler.GetElementTextByTag("name"); key = protocalHandler.Base64stringToString(key); if (!key.Equals(targetName)) { throw new MyProtocalException( "不是有效的2次确认," + "找不到name标签或接受方用户名不符"); } // 己方用户名 string myName = protocalHandler.GetElementTextByTag("you"); myName = protocalHandler.Base64stringToString(myName); if (!myName.Equals(main.MyName)) { throw new MyProtocalException( "2次确认发现错误,找不到you标签" + "或接受方返回的发送方用户名不符"); } // 开始通信 owner.BeginInvoke(owner.sendRTFDelegate, rtfToSend); rtfToSend = null; beginReceive(); } catch (Exception ex) { Trace.WriteLine("异常位置:" + "createSocketNameReceivedEventHandler"); Trace.WriteLine(ex.Message); CloseSocket(); } }
/// <summary> /// 接受方 /// 收到1次确认,判断连接的类型 /// </summary> /// <param name="sender"></param> /// <param name="ea"></param> private void firstAckReceivedEventHandler( object sender, EventArgs ea) { Socket rcvSocket = sender as Socket; try { // 接收到的异步Socket事件参数 SocketAsyncEventArgs socketAsyncEA = (SocketAsyncEventArgs)ea; // 提取接收到的文本 string rcvString = Encoding.ASCII.GetString(socketAsyncEA.Buffer); ProtocalHandler protocalHandler = new ProtocalHandler(MyName); // 是否是协议 if (!protocalHandler.SetXmlText(rcvString)) { throw new MyProtocalException( "不是有效的协议文本,找不到CSP2P标签"); } // 数据包类型 string type = protocalHandler.GetElementTextByTag("type"); if (type == null) { throw new MyProtocalException( "不是有效的1次确认,找不到type标签"); } if (type.Equals("closesocket")) // 对方要求关闭Socket { rcvSocket.Close(); } // 对方用户名 string targetNameBase64 = protocalHandler.GetElementTextByTag("name"); string targetName = protocalHandler.Base64stringToString(targetNameBase64); if (targetName == null) { throw new MyProtocalException( "不是有效的1次确认," + "找不到name标签"); } if (type.Equals("init_chat_request")) // 私聊 { P2PChatClient socketHandler = new P2PChatClient(this, rcvSocket); socketHandler.newSocketChatNameReceived(protocalHandler); } else if (type.Equals("init_gp_request")) // 群聊 { P2PGroupClient socketHandler = new P2PGroupClient(this, rcvSocket); socketHandler.newSocketGroupNamesReceived(protocalHandler); } else { throw new MyProtocalException( "不是有效的1次确认," + "type不为init_chat_request或init_gp_request"); } // 记录对方地址 if (remoteIPaddress.ContainsKey(targetName)) { remoteIPaddress[targetName] = new IPInfo((IPEndPoint)rcvSocket.RemoteEndPoint); } else { remoteIPaddress.Add(targetName, new IPInfo((IPEndPoint)rcvSocket.RemoteEndPoint)); } } catch (Exception ex) { Trace.WriteLine("异常位置:" + "firstAckReceivedEventHandler"); Trace.WriteLine(ex.Message); // 直接关闭socket try { rcvSocket.Close(); } catch (Exception ex2) { Trace.WriteLine("异常位置:" + "firstAckReceivedEventHandler出错关闭rcvSocket时"); Trace.WriteLine(ex2.Message); } } }