2011-01-24 1 views
1

J'essaie de communiquer avec un serveur qui utilise DataInputStream.readUTF et DataOutputStream.writeUTF.Comment lire/écrire avec netty quand l'autre côté utilise readUTF/writeUTF?

j'ai fait le code habituel bootstrapping pour configurer mon client, et définir la pipelinefactory suivante

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()); 
     } 
    }); 

dans MyClientHandler qui s'étend SimpleChannelUpstreamHandler, je donne les résultats suivants:

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 du serveur avec succès, mais le serveur ne reçoit pas mon message "bonjour là-bas". Je ne sais pas ce que j'ai pu ignorer.

En outre, notez le booléen envoyé, puis-je ajouter de tels champs et travailler avec eux sans problèmes de threading?

Répondre

3
  • J'ai réussi à recevoir des messages du serveur avec succès, mais le serveur ne reçoit pas mon message "bonjour là-bas". Je ne sais pas ce que j'ai pu ignorer.

Comme a pu être reçu le message du serveur en utilisant LengthFieldBasedFrameDecoder, le message a un champ de longueur. Par conséquent, il est possible que le serveur s'attende à ce que le message reçu ait le champ de longueur. Par conséquent, il est possible que le serveur reçoive le champ de longueur. Comment si le champ de longueur est écrit comme suit?

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

[exemple]

@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 les booléens envoyés, puis-je ajouter ces champs et travailler avec eux sans enfiler des préoccupations?

Oui, vous pouvez ajouter les champs pour stocker un état. Et vous n'avez pas besoin de prendre en compte la synchronisation du thread.

+0

Je pense qu'une approche encore plus propre serait d'ajouter org.jboss.netty.handler.codec.frame.LengthFieldPrepender au pipeline du serveur. Cela ajoutera automatiquement le champ lengthField au paquet sortant. – Abe

Questions connexes