Wie liest/schreibe ich mit Netty, wenn andere Seite Readutf/Writeutf verwendet?

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

  •  24-10-2019
  •  | 
  •  

Frage

Ich versuche, mit einem Server zu kommunizieren, der datainputStream.readutf und DataOutputStream.writeUtf verwendet.

Ich habe den üblichen Bootstrapping -Code gemacht, um meinen Client einzurichten, und den folgenden PipelineFactory festgelegt

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

In MyClientHandler, das simplechannelupStreamHandler erweitert, habe ich Folgendes:

    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
        }
    }

Ich habe es geschafft, Nachrichten vom Server erfolgreich zu empfangen, aber der Server empfängt meine "Hallo drüben" -Meldung nicht. Ich bin mir nicht sicher, was ich übersehen hätte.

Beachten Sie auch, dass der Boolesche gesendete Boolesche solche Felder hinzufügen und mit ihnen arbeiten, ohne Bedenken zu fädeln?

War es hilfreich?

Lösung

  • Ich habe es geschafft, Nachrichten vom Server erfolgreich zu empfangen, aber der Server empfängt meine "Hallo drüben" -Meldung nicht. Ich bin mir nicht sicher, was ich übersehen hätte.

Da die Nachricht vom Server mithilfe von LängenfieldFasedFramedCoder empfangen werden konnte, verfügt die Nachricht über ein Längefeld.

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

Daher besteht die Möglichkeit, dass der Server erwartet, dass die empfangene Nachricht über das Feld Länge verfügt. Wie, wenn das Feld Länge wie folgt geschrieben ist?

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

Probe

@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
    }
}
  • Beachten Sie auch, dass der Boolesche gesendete Boolesche solche Felder hinzufügen und mit ihnen arbeiten, ohne Bedenken zu fädeln?

Ja, Sie können die Felder hinzufügen, um einen Zustand zu speichern. Und Sie müssen die Synchronisation des Threads nicht berücksichtigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top