コード例 #1
0
ファイル: P2PGroupClient.cs プロジェクト: bssthu/CSP2P
        /// <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();
                }
            }
        }
コード例 #2
0
 /// <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();
     }
 }
コード例 #3
0
        /// <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);
                }
            }
        }