2017-12-16 5 views
2

Es ist ein Java TCP-Client mit einem Server unter Verwendung Netty verbunden. Schreiben in einem getrennten Kanal verursacht eine Ausnahme. Es ist nicht wichtig, welches Problem das verursacht, aber es ist mir wichtig, welche Nachricht nicht gesendet wurde und verursachte die Ausnahme.Wie finde ich heraus, welche Nachricht beim Schreiben von Netty eine Ausnahme verursacht?

Wie findet man es [mit ChannelPromise oder ChannelFuture]?

Hier bekomme ich nur 'f.isSuccess()==true', aber es ist kein Erfolg! Nachricht wurde nicht gesendet!

ChannelPromise promise = c.newPromise(); 
      promise.addListener(new ChannelFutureListener() { 
       @Override 
       public void operationComplete(ChannelFuture f) { 
        System.err.println("<TCPIn: promise write operationComplete."); 
        if (!f.isSuccess()) { 
         System.err.println("<TCPIn[writting]: promise write ERROR:"); 
         f.cause().printStackTrace(); 
         f.channel().close(); 
        } 
       } 
      }); 
channel.writeAndFlush(buf,promise); 
+0

Können Sie nicht auf Ihr Buf-Objekt vom Hörer selbst zugreifen? Dies würde in den meisten Fällen funktionieren, aber nicht in den Fällen, die EJP in seiner Antwort – Ferrybig

Antwort

1

Es ist nicht so einfach. Was die Ausnahme verursachte, war der Fehler, eine Bestätigung für ein Segment zu erhalten, das vom Socket-Sendepuffer gesendet wurde. Die Korrelation mit einer bestimmten Nachricht kann null sein. Es hätte zum Beispiel die Hälfte einer Nachricht und die Hälfte der nächsten sein können, und es wären sicherlich Daten von einem früheren Schreiben als dem gerade abgeschlossenen gewesen. Denken Sie daran, dass "Schreibvervollständigung" in TCP nichts anderes bedeutet als eine erfolgreiche Pufferung der Daten im Socket-Sendepuffer.

+0

sagt, OK, du hast Recht. Also wie finde ich heraus, ob die Nachricht vollständig gesendet wurde oder nicht? Ich möchte nur wissen, ob die Nachricht erfolgreich gesendet wurde. –

+2

Die einzige Möglichkeit, wirklich sicherzustellen, dass etwas in TCP erfolgreich empfangen wurde, ist das Zurücksenden einer "ACK-Nachricht". Dies ist Teil Ihres Protokolls selbst und würde auf TCP aufbauen. –

+0

@NormanMaurer Ich will nichts über das Empfangen von Nachrichten wissen, ich möchte nur wissen, ob eine Nachricht erfolgreich gesendet wurde oder nicht. –

Verwandte Themen