Пример #1
0
        public void Start(string hostname, int port)
        {
            if (client != null)
            {
                return;
            }

            if (TryToConnect(hostname, port))
            {
                Task.Factory.StartNew(() =>
                {
                    var messageDecoder = new MessageDecoder();
                    var stream         = client.GetStream();
                    try
                    {
                        while (client.Connected)
                        {
                            var message = messageDecoder.Decode(stream);
                            OnShadeSelected?.Invoke(this, new MessageEventArgs(message));
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    finally
                    {
                        Stop();
                    }
                });
            }
        }
Пример #2
0
        public static DecodedMessage <byte[]> ReceiveMessage(Socket sock)
        {
            int length   = -1;
            int received = 0;

            byte[] bytes = new byte[1500];

            try
            {
                while (true)
                {
                    int bytesRec = sock.Receive(bytes, received, 1500 - received, SocketFlags.None);
                    received += bytesRec;

                    if (received >= sizeof(int) && length == -1)
                    {
                        length = BitConverter.ToInt32(bytes, 0);
                    }

                    if (received >= length && length > 0)
                    {
                        break;
                    }
                }
            }
            catch
            {
                throw new DeadConnectionException();
            }


            var response = MessageDecoder.Decode(bytes.Skip(sizeof(int)).Take(length).ToArray());

            return(response);
        }
Пример #3
0
        static void Main()
        {
            MessageIOGateway gw = new MessageIOGateway();
            MessageDecoder   d  = new MessageDecoder();
            MessageEncoder   e  = new MessageEncoder();

            Message m = new Message();

            m.what = PR_COMMAND_GETDATA;
            string text = "*";

            m.setString(PR_NAME_KEYS, text);

            e.Encode(m);

            byte [] buffer = e.GetAndResetBuffer();
            long    start  = DateTime.Now.Ticks;

            for (int i = 0; i < MESSAGE_COUNT; ++i)
            {
                d.Decode(buffer, buffer.Length);
            }

            long end     = DateTime.Now.Ticks;
            long elapsed = end - start;

            DateTime t = new DateTime(elapsed);

            Console.WriteLine("Elapsed time: " + t.ToString());
            Console.WriteLine("Messages flattened and unflattened: " + MESSAGE_COUNT.ToString());
        }
Пример #4
0
            /// <summary>
            /// 读取Packet。
            /// </summary>
            private void ReadPacket()
            {
                var serializer = new PacketSerializer();
                var type       = typeof(Packet);

                while (Running)
                {
                    try
                    {
                        if (_msgQueue == null)
                        {
                            return;
                        }

                        if (_tcpClient.Available > 0)
                        {
                            var stream = _tcpClient.GetStream();
                            var packet =
                                serializer.DeserializeWithLengthPrefix(stream, null, type, PrefixStyle.Fixed32BigEndian,
                                                                       0) as Packet;
                            var msg = MessageDecoder.Decode(packet, _parent.Server);

                            if (msg != null && _msgQueue != null)
                            {
                                _msgQueue.EnqueueReadMessage(msg);
                            }
                        }
                        else
                        {
                            Thread.Sleep(DataCheckInterval);
                        }
                    }
                    catch (ObjectDisposedException e)
                    {
                        // 客户端已经被销毁了,需要断开连接。
                        if (_parent != null)
                        {
                            _parent.Close();
                        }
                    }
                    catch (IOException e)
                    {
                        // 通信发生错误,需要断开连接。
                        if (_parent != null)
                        {
                            _parent.Close();
                        }
                    }
                    catch (ThreadInterruptedException e)
                    {
                    }
                    catch (Exception e)
                    {
                    }
                }
            }
Пример #5
0
        public void CanMarkAsResponse()
        {
            var message = new MessageBuilder()
                          .MarkAsResponse()
                          .PutOperationCode("33")
                          .PutPayload("Hello there")
                          .Build();

            var decoded = MessageDecoder.Decode(message.Skip(sizeof(int)).ToArray());

            Assert.IsTrue(decoded.IsResponse);
        }
Пример #6
0
        public void CanSetAuthInfo()
        {
            var message = new MessageBuilder()
                          .PutAuthInfo("220159")
                          .PutOperationCode("24")
                          .PutPayload("Hello there")
                          .Build();

            var decoded = MessageDecoder.Decode(message.Skip(sizeof(int)).ToArray());

            Assert.AreEqual("220159", decoded.Auth);
        }
Пример #7
0
        public void BuildsStringMessageCorrectly()
        {
            var payload = "Hello there!";

            var message = new MessageBuilder()
                          .PutOperationCode("12")
                          .PutPayload(payload)
                          .Build();

            var decoded = MessageDecoder.Decode(message.Skip(sizeof(int)).ToArray());

            Assert.IsFalse(decoded.IsResponse);
            Assert.AreEqual("------", decoded.Auth);
            Assert.AreEqual("12", decoded.Code);
            Assert.AreEqual(payload, MessageDecoder.DecodePayload(decoded.Payload));
        }
Пример #8
0
        public void BuildsObjectMessageCorrectly()
        {
            var user = new User()
            {
                Id   = 3,
                Name = "El hijo de Piri"
            };

            var message = new MessageBuilder()
                          .PutOperationCode("14")
                          .PutPayload(user)
                          .Build();

            var decoded = MessageDecoder.Decode(message.Skip(sizeof(int)).ToArray());
            var payload = MessageDecoder.DecodePayload <User>(decoded.Payload);

            Assert.IsFalse(decoded.IsResponse);
            Assert.AreEqual("------", decoded.Auth);
            Assert.AreEqual("14", decoded.Code);
            Assert.AreEqual(user.Id, payload.Id);
            Assert.AreEqual(user.Name, payload.Name);
        }