Exemple #1
0
        private void ProcessReceive(SocketAsyncEventArgs receiver)
        {
            if (receiver.LastOperation != SocketAsyncOperation.Receive)
            {
                return;
            }
            if (receiver.BytesTransferred > 0)
            {
                if (receiver.SocketError == SocketError.Success)
                {
                    int    _byteTransferred = receiver.BytesTransferred;
                    string _received        = Encoding.Unicode.GetString(receiver.Buffer, receiver.Offset, _byteTransferred);

                    SocketRequestMessage _msg = SocketRequestHandler.GetActualString(_received);

                    if (this.OnMsgReceived != null)
                    {
                        OnMsgReceived((receiver as SocketAsyncEventArgsImpl).UID, _msg);
                    }

                    bool _willRaiseEvent = (receiver.UserToken as Socket).ReceiveAsync(receiver);
                    if (!_willRaiseEvent)
                    {
                        ProcessReceive(receiver);
                    }
                }
            }
            else
            {
                this.CloseClientSocket((receiver as SocketAsyncEventArgsImpl).UID, true);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnReceive(object sender, SocketAsyncEventArgs e)
        {
            string msg = Encoding.Unicode.GetString(e.Buffer, 0, e.BytesTransferred);
            SocketRequestMessage _msgs = SocketRequestHandler.GetActualString(msg);

            ListenAsync();
            if (OnMsgReceived != null)
            {
                OnMsgReceived(_msgs);
            }
        }
        /// <summary>
        /// 开始监听线程的入口函数
        /// </summary>
        public string Listen(Socket socket = null)
        {
            if (socket == null)
            {
                socket = (_readWirted.ReceiveSAEA.UserToken as Socket);
            }

            byte[]        _bytes = new byte[1024];
            StringBuilder _sb    = new StringBuilder();

            int    flag = socket.Receive(_bytes, 0, _bytes.Length, SocketFlags.None);
            string _msg = Encoding.Unicode.GetString(_bytes);

            _sb.Append(_msg);
            SocketRequestMessage _rquestMsg = SocketRequestHandler.GetActualString(_msg);

            //如果没有接收到定长的数据,循环接收
            while (flag != _rquestMsg.MessageLength)
            {
                flag += socket.Receive(_bytes, flag, _bytes.Length - flag, SocketFlags.None);
                _sb.Append(Encoding.Unicode.GetString(_bytes));
            }
            return(_sb.ToString());
        }
Exemple #4
0
        public static SocketRequestMessage GetActualString(string input, List <string> outputList = null)
        {
            if (outputList == null)
            {
                outputList = new List <string>();
            }

            if (!string.IsNullOrEmpty(temp))
            {
                input = temp + input;
            }

            string output  = "";
            string lenStr  = @"(?<=^\[length=)(\d+)(?=\])";
            string pattern = @"(\[MSG=)(JSON|XML|NONE|REQUEST)(?=\])";
            int    length  = 0;
            SocketMessageInfoType _type = CheckMessageInfoType(input);

            if (Regex.IsMatch(input, lenStr))
            {
                Match lenRex = Regex.Match(input, lenStr);
                length = Convert.ToInt32(lenRex.Groups[0].Value);

                if (Regex.IsMatch(input, pattern))
                {
                    Match m          = Regex.Match(input, pattern);
                    int   startIndex = input.IndexOf(m.Groups[0].Value + "]") + m.Groups[0].Value.Length + 1;
                    output = input.Substring(startIndex);

                    if (output.Length == length)
                    {
                        outputList.Add(output);
                        temp = "";
                    }
                    else if (output.Length < length)
                    {
                        temp = input;
                    }
                    else if (output.Length > length)
                    {
                        output = output.Substring(0, length);
                        outputList.Add(output);
                        temp  = "";
                        input = input.Substring(startIndex + length);
                        GetActualString(input, outputList);
                    }
                }
            }
            else
            {
                temp = input;
            }

            SocketRequestMessage message = new SocketRequestMessage()
            {
                MessageLength = length,
                MessageType   = _type,
                Messages      = outputList.ToArray()
            };

            return(message);
        }