Comment lire / écrire avec Netty quand autre côté utilise readUTF / writeUTF?

StackOverflow https://stackoverflow.com/questions/4787286

  •  24-10-2019
  •  | 
  •  

Question

Je suis en train de communiquer avec un serveur qui utilise DataInputStream.readUTF et DataOutputStream.writeUTF.

Je l'ai fait le code habituel bootstrapping pour configurer mon client, et définir les paramètres suivants pipelinefactory

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new LengthFieldBasedFrameDecoder(65536, 0, 2),
                    new StringDecoder(CharsetUtil.UTF_8),
                    new StringEncoder(CharsetUtil.UTF_8),
                    new MyClientHandler());
        }
    });

en MyClientHandler qui se prolonge SimpleChannelUpstreamHandler, j'ai la suivante:

    boolean sent = false; //is this thread safe?

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        logger.log(Level.INFO, e.getMessage().toString());
        e.getChannel().write("Hello over there!");

        if(!sent){
             //do something and set sent
        }
    }

J'ai réussi à recevoir des messages depuis un serveur avec succès, mais le serveur ne reçoit pas mon message « bonjour là-bas ». Je ne sais pas ce que je pourrais avoir négligé.

Notez également la boîte d'envoi booléen, puis-je ajouter ces champs et travailler avec eux sans filetage préoccupations?

Était-ce utile?

La solution

  • J'ai réussi à recevoir des messages depuis un serveur avec succès, mais le serveur ne reçoit pas mon message « bonjour là-bas ». Je ne sais pas ce que je pourrais avoir négligé.

Parce a pu être reçu le message du serveur en utilisant LengthFieldBasedFrameDecoder, le message a un champ de longueur.

 +--------+----------+
 | Length | Message  |
 +--------+----------+

Par conséquent, il est possible que le serveur attend le message reçu a le champ de longueur. Comment est écrit si le champ de longueur comme suit?

 +--------+---------------------+
 | 0x0011 | "Hello over there!" |
 +--------+---------------------+

[échantillon]

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    logger.log(Level.INFO, e.getMessage().toString());
    byte[] message = "Hello over there!".getBytes("UTF-8");

    ChannelBuffer buf = ChannelBuffers.buffer(message.length + 2);
    buf.clear();
    short len = (short)message.length;
    buf.writeShort(len);
    buf.writeBytes(message);
    e.getChannel().write(buf);

    if(!sent){
        //do something and set sent
    }
}
  • Notez également la boîte d'envoi booléen, puis-je ajouter ces champs et travailler avec eux sans filetage préoccupations?

Oui, vous pouvez ajouter les champs pour stocker un état. Et vous ne devez pas considérer la synchronisation du fil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top