public override void Read(ChannelHandlerContext ctx, object msg) { // server-side: // message comes (over network) from sender // -> correct DispatchHandler handles response // Java uses a SimpleChannelInboundHandler that only expects Message objects var requestMessage = msg as Message.Message; if (requestMessage == null) { return; } Logger.Debug("Received request message {0} from channel {1}.", requestMessage, ctx.Channel); if (requestMessage.Version != _p2PId) { Logger.Error("Wrong version. We are looking for {0}, but we got {1}. Received: {2}.", _p2PId, requestMessage.Version, requestMessage); ctx.Close(); // TODO used? lock (_peerBeanMaster.PeerStatusListeners) { foreach (IPeerStatusListener listener in _peerBeanMaster.PeerStatusListeners) { listener.PeerFailed(requestMessage.Sender, new PeerException(PeerException.AbortCauseEnum.PeerError, "Wrong P2P version.")); } } return; } if (!requestMessage.IsRequest()) { Logger.Debug("Handing request message to the next handler. {0}", requestMessage); ctx.FireRead(msg); return; } IResponder responder = new DirectResponder(this, _peerBeanMaster, ctx, requestMessage); DispatchHandler myHandler = AssociatedHandler(requestMessage); if (myHandler != null) { bool isUdp = ctx.Channel.IsUdp; bool isRelay = requestMessage.Sender.IsRelayed; if (!isRelay && requestMessage.PeerSocketAddresses.Count != 0) { PeerAddress sender = requestMessage.Sender.ChangePeerSocketAddresses(requestMessage.PeerSocketAddresses); requestMessage.SetSender(sender); } Logger.Debug("About to respond to request message {0}.", requestMessage); // handle the request message PeerConnection peerConnection = null; if (!isUdp) { var tcpChannel = ctx.Channel as ITcpChannel; peerConnection = new PeerConnection(requestMessage.Sender, tcpChannel, _heartBeatMillis); } myHandler.ForwardMessage(requestMessage, peerConnection, responder); } else { // do better error handling // if a handler is not present at all, print a warning if (_ioHandlers.Count == 0) { Logger.Debug("No handler found for request message {0}. This peer has probably been shut down.", requestMessage); } else { var knownCommands = KnownCommands(); if (knownCommands.Contains(Convert.ToInt32(requestMessage.Command))) { var sb = new StringBuilder(); foreach (int cmd in knownCommands) { sb.Append((Rpc.Rpc.Commands) cmd + "; "); } Logger.Warn("No handler found for request message {0}. Is the RPC command {1} registered? Found registered: {2}.", requestMessage, (Rpc.Rpc.Commands) requestMessage.Command, sb); } else { Logger.Debug("No handler found for request message {0}. This peer has probably been partially shut down.", requestMessage); } } // return response that states that no handler was found var responseMessage = DispatchHandler.CreateResponseMessage(requestMessage, Message.Message.MessageType.UnknownId, _peerBeanMaster.ServerPeerAddress); Respond(ctx, responseMessage); } }
public override void Read(ChannelHandlerContext ctx, object msg) { // server-side: // message comes (over network) from sender // -> correct DispatchHandler handles response // Java uses a SimpleChannelInboundHandler that only expects Message objects var requestMessage = msg as Message.Message; if (requestMessage == null) { return; } Logger.Debug("Received request message {0} from channel {1}.", requestMessage, ctx.Channel); if (requestMessage.Version != _p2PId) { Logger.Error("Wrong version. We are looking for {0}, but we got {1}. Received: {2}.", _p2PId, requestMessage.Version, requestMessage); ctx.Close(); // TODO used? lock (_peerBeanMaster.PeerStatusListeners) { foreach (IPeerStatusListener listener in _peerBeanMaster.PeerStatusListeners) { listener.PeerFailed(requestMessage.Sender, new PeerException(PeerException.AbortCauseEnum.PeerError, "Wrong P2P version.")); } } return; } if (!requestMessage.IsRequest()) { Logger.Debug("Handing request message to the next handler. {0}", requestMessage); ctx.FireRead(msg); return; } IResponder responder = new DirectResponder(this, _peerBeanMaster, ctx, requestMessage); DispatchHandler myHandler = AssociatedHandler(requestMessage); if (myHandler != null) { bool isUdp = ctx.Channel.IsUdp; bool isRelay = requestMessage.Sender.IsRelayed; if (!isRelay && requestMessage.PeerSocketAddresses.Count != 0) { PeerAddress sender = requestMessage.Sender.ChangePeerSocketAddresses(requestMessage.PeerSocketAddresses); requestMessage.SetSender(sender); } Logger.Debug("About to respond to request message {0}.", requestMessage); // handle the request message PeerConnection peerConnection = null; if (!isUdp) { var tcpChannel = ctx.Channel as ITcpChannel; peerConnection = new PeerConnection(requestMessage.Sender, tcpChannel, _heartBeatMillis); } myHandler.ForwardMessage(requestMessage, peerConnection, responder); } else { // do better error handling // if a handler is not present at all, print a warning if (_ioHandlers.Count == 0) { Logger.Debug("No handler found for request message {0}. This peer has probably been shut down.", requestMessage); } else { var knownCommands = KnownCommands(); if (knownCommands.Contains(Convert.ToInt32(requestMessage.Command))) { var sb = new StringBuilder(); foreach (int cmd in knownCommands) { sb.Append((Rpc.Rpc.Commands)cmd + "; "); } Logger.Warn("No handler found for request message {0}. Is the RPC command {1} registered? Found registered: {2}.", requestMessage, (Rpc.Rpc.Commands)requestMessage.Command, sb); } else { Logger.Debug("No handler found for request message {0}. This peer has probably been partially shut down.", requestMessage); } } // return response that states that no handler was found var responseMessage = DispatchHandler.CreateResponseMessage(requestMessage, Message.Message.MessageType.UnknownId, _peerBeanMaster.ServerPeerAddress); Respond(ctx, responseMessage); } }