private void ReceiveCallback(IAsyncResult ar) { try { Byte[] payload = _serverSocket.EndReceive(ar, ref _localEP); IdentifyMessageType(payload); if (_messageType == null || _messageType.Value == ChoNetMessageType.Raw) { EventHandler <ChoNetMessageEventArgs> rawMessageReceived = RawMessageReceived; if (rawMessageReceived != null) { rawMessageReceived(this, new ChoNetMessageEventArgs(null, payload)); } } else if (_messageType.Value == ChoNetMessageType.Xml) { try { ChoNetMessage msg = (ChoNetMessage)_encoding.GetString(payload).ToObjectFromXml(); // ChoObject.XmlDeserialize<ChoNetMessage>(_encoding.GetString(payload)); if (!PreProcessMessage(msg)) { EventHandler <ChoNetMessageEventArgs> messageReceived = MessageReceived; if (messageReceived != null) { messageReceived(this, new ChoNetMessageEventArgs(msg, null)); } } } catch (Exception ex) { ChoTrace.Error(ex.ToString()); } } else if (_messageType.Value == ChoNetMessageType.Binary) { try { ChoNetMessage msg = (ChoNetMessage)ChoObject.Deserialize(payload); if (!PreProcessMessage(msg)) { EventHandler <ChoNetMessageEventArgs> messageReceived = MessageReceived; if (messageReceived != null) { messageReceived(this, new ChoNetMessageEventArgs(msg, null)); } } } catch (Exception ex) { ChoTrace.Error(ex.ToString()); } } } finally { _recieveResult = _serverSocket.BeginReceive(ReceiveCallback, null); } }
protected virtual bool PreProcessMessage(ChoNetMessage msg) { if (msg is ChoPingNetMessage) { if (IsServer) { return(true); } else { _lastPingMsgArrived = msg.TimeStamp; //IsServerAvailable = true; return(true); } } return(false); }
private byte[] ConvertToBytes(ChoNetMessage obj) { if (_messageType == ChoNetMessageType.Xml) { return(_encoding.GetBytes(obj.ToNullNSXmlWithType())); } else if (_messageType == ChoNetMessageType.Binary) { return(ChoObject.Serialize(obj)); } else { if (SerializePayload != null) { return(SerializePayload(obj.Payload)); } else { return(null); } } }
private void IdentifyMessageType(byte[] payload) { if (_identifiedMessageType) { return; } try { if (_messageType == null) { _messageType = ChoNetMessageType.Raw; try { ChoNetMessage scalarObject = (ChoNetMessage)ChoObject.Deserialize(payload); _messageType = ChoNetMessageType.Binary; } catch { try { ChoNetMessage scalarObject = (ChoNetMessage)(ChoNetMessage)_encoding.GetString(payload).ToObjectFromXml(); // ChoObject.XmlDeserialize<ChoNetMessage>(_encoding.GetString(payload)); _messageType = ChoNetMessageType.Xml; } catch { Trace.WriteLine("Failed to identity message type. Setting the message format as raw payload mode."); } } } } finally { _identifiedMessageType = true; } }
public ChoNetMessageEventArgs(ChoNetMessage message, byte[] rawMessage) { Message = message; RawPayload = rawMessage; }