0

Netty の新しい 4.x API では、いくつかの変更 (大きなものと小さなもの) がありました。古いサーバー コアを新しい API で動作するように移行しましたが、この問題を解決する方法がわかりません。3.xでは、使用できました

     MessageEvent e

これにより、e を必要な型にキャストすることができました (この場合は、サーバーからクライアントへのメッセージに使用される 2 つの型であるため、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
            }
   }

私の基本的な問題は、String と ServerMessage をクライアントに書き込むにはどうすればよいかということです。(私の文字列は単純です)

どんな助けでも大歓迎です!

4

1 に答える 1

0

両方のオブジェクトに同じ ChannelHandler を本当に使用したい場合は、2 つのメッセージの共通のスーパークラスを使用し、3.x で行ったようにキャストするだけです。とにかく、2 つの異なる ChannelHandler を使用するだけで、はるかにクリーンになると思います。

于 2012-10-04T09:13:05.473 に答える