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(); } }); } }
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); }
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()); }
/// <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) { } } }
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); }
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); }
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)); }
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); }