0

使用 Netty 的新 4.x API,发生了一些变化(有些大有些小)。我已经迁移了我的旧服务器核心以使用新的 API,但我无法找到解决此问题的方法。在 3.x 中,我可以使用

     MessageEvent e

这使我可以将 e 转换为我需要的类型(在本例中为 ServerMessage 和 String,因为它们是用于服务器->客户端消息的两种类型)。

使用 3.x 时,我可以这样做:

  public void writeRequested(ChannelHandlerContext chctx, MessageEvent e)
    {
        if(e.getMessage() instanceof ServerMessage) //change 
        {
         ServerMessage message = (ServerMessage) e.getMessage();
        Channels.write(chctx,e.getFuture(),message.getData());
        logger.debug("Message sent (id: "+message.getMessageID()+ " data: "+message.getMessageBody()+")");


    }

        else if(e.getMessage() instanceof String)
        {
            String data =(String)e.getMessage();
            ChannelBuffer buffer = ChannelBuffers.buffer(data.length());
            buffer.writeBytes(data.getBytes());

            Channels.write(chctx,e.getFuture(),buffer);

            logger.debug("Written string (possible <policy-file-request />) to client #id ->" +
                    +Environment.getGameInstance().getManager().getSession(chctx.getChannel());
        }
    }

但是,对于 4.x,我对我可以使用什么感到有点困惑。我已经部分实现了像这样的简单发送;

public void encode(ChannelHandlerContext ctx, ServerMessage msg, ByteBuf buffer) {

   if(msg instanceof ServerMessage) {

        ServerMessage message = (ServerMessage)msg;
        ctx.channel().write(message.getData());
        logger.debug("Message sent (id: "+message.getMessageID()+ " data: "+message.getMessageBody()+")");

   }
    else {
                 // string stuff here
            }
   }

我的基本问题是,我将如何向客户端编写字符串和 ServerMesssage?(我的字符串很简单)

任何帮助是极大的赞赏!

4

1 回答 1

0

如果您真的想对两个对象使用相同的 ChannelHandler,只需使用这两个消息的公共超类,然后像在 3.x 中所做的那样进行转换。无论如何,我认为如果你只使用两个不同的 ChannelHandler 会更干净。

于 2012-10-04T09:13:05.473 回答