[JAVA] So wechseln Sie in Netty dynamisch zwischen FIN und RST

Wenn Sie einen Server mit Netty erstellen, möchten Sie möglicherweise FIN und RST ordnungsgemäß verwenden, abhängig von der Situation beim Schließen von Channel (Socket). Beispielsweise besteht die Anforderung, dass FIN (RST bei verzögertem Timeout) normal ist, RST jedoch sofort erkannt wird, wenn eine Abnormalität erkannt wird.

Festlegen des Standardverhaltens beim Schließen

Ob FIN / RST verwendet werden soll, wenn "Channel" geschlossen ist, kann beim Erstellen von "ServerBootstrap" angegeben werden.

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(0);
ServerBootstrap bootstrap = new ServerBootstrap()
    .option(ChannelOption.SO_BACKLOG, 1024)
    .group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childOption(ChannelOption.SO_LINGER, 10) //FIN → Timeout verzögern(10 Sekunden)→ Geben Sie an, dass mit RST geschlossen werden soll
    .childHandler(new MyChannelInitializer());
// ...

NOTE:

Die Freigabe durch RST, die> -1 angibt, ist deaktiviert.

Wählen Sie beim Schließen FIN / RST

Wenn Sie den "ServerBootstrap" auf eine andere Weise als das beim Erstellen angegebene Standardverhalten schließen möchten, können Sie dies tun, indem Sie die "ChannelConfig" aus dem "Channel" abrufen und die Einstellung "SO_LINGER" ändern.

@ChannelHandler.Sharable
class MyHandler extends SimpleChannelInboundHandler<byte[]> {
  @Override
  protected void channelRead0(ChannelHandlerContext ctx, byte[] msg) {
    // ...
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    ctx.channel().config().setOption(ChannelOption.SO_LINGER, 0); //Geben Sie an, dass RST sofort geschlossen werden soll
    ctx.close();
  }

}

Recommended Posts

So wechseln Sie in Netty dynamisch zwischen FIN und RST
Dynamisches Wechseln von JDKs beim Erstellen von Java mit Gradle
So wechseln Sie zwischen mehreren Java-Versionen
Ruby So konvertieren Sie zwischen Groß- und Kleinschreibung
Wechseln Sie zwischen JDK 7 und JDK 8
So wechseln Sie Tomcat context.xml mit Eclipse WTP
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Umgang mit TSV-Dateien und CSV-Dateien in Ruby
So starten Sie die Swagger-Benutzeroberfläche und den Swagger-Editor in Docker
So legen Sie mit JAXB Zeichencode und Zeilenvorschubcode fest
Ich habe zum ersten Mal seit einiger Zeit einen DB-Suchprozess in Rails geschrieben und untersucht, wie eine Datumsvergleichssuche geschrieben wird. Deshalb habe ich ein Memo geschrieben. Die meiste Zeit, wenn ich nach etwas anderem suchte, wie SQL schreiben oder Arel verwenden, konnte ich es wie folgt schreiben. Das Gegenteil ist wahr. So verhindern Sie Konflikte zwischen Ruby, dem Rails JBoss-Modul und der Anwendungsbibliothek
Bedingte Java-Verzweigung: Erstellen und Studieren von switch-Anweisungen
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Forge] So registrieren Sie Ihre eigene Entität und Ihr Entity Render in 1.13.2
Implementierungsrichtlinie zum dynamischen Speichern und Anzeigen der Zeitzone in Rails
So legen Sie den Zeichencode und den Zeilenvorschubcode in Eclipse fest
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Aufrufen und Verwenden der API in Java (Spring Boot)
So entwickeln und registrieren Sie eine Sota-App in Java
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
So installieren Sie PHP 7.4- und SQL Server-Treiber in CentOS 7.7
So fügen Sie PKCE Code_Verifier und Code_Challenge in die JMeter-Anforderung ein
Wie POST JSON in Java-Methode mit OkHttp3 und Methode mit HttpUrlConnection-
[Webpacker] Zusammenfassung der Installation von Bootstrap und jQuery in Rails 6.0
So wechseln Sie die Java-Version mit direnv im Terminal auf dem Mac
So legen Sie ein Profil mit annotationsbasierter Konfiguration im Spring-Framework fest und verwenden es
[jOOQ] Wie in der WHERE / AND / OR-Klausel WANN FALLEN
So löschen Sie große Datenmengen in Rails und Bedenken
Wie installiere ich die in Ubuntu verwendete Sprache und wie erstelle ich die Umgebung?
So synchronisieren Sie Kundendaten zwischen Salesforce und Kintone (Java-Simple JDBC)
Abrufen und Hinzufügen von Daten aus dem Firebase Firestore in Ruby
Wie man Lombok im Frühling benutzt
Verwendung von StringBurrer und Arrays.toString.
Wechseln Sie dynamisch die Datenbank, zu der eine Verbindung hergestellt werden soll
So führen Sie JUnit in Eclipse aus
Verwendung von EventBus3 und ThreadMode
Wie man in Ruby auf unbestimmte Zeit iteriert
Wie man Ant in Gradle ausführt
Wie man die Programmierung in 3 Monaten beherrscht
Wie man JAVA in 7 Tagen lernt
So erhalten Sie Parameter in Spark
Aufrufen von Klassen und Methoden
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
So installieren Sie Bootstrap in Ruby
So verbinden Sie Heroku und Sequel
So konvertieren Sie LocalDate und Timestamp
So installieren Sie jQuery in Rails 6
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So setzen Sie Lombok in Eclipse
So verketten Sie Zeichenfolgen mit Java
So installieren Sie Swiper in Rails
So rufen Sie Bibliotheken wie JQuery und JQuery UI in Liferay 7 / DXP auf
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So erstellen Sie Ihre eigene Anmerkung in Java und erhalten den Wert
[swift5] So legen Sie die Farbe hexadezimal fest
So implementieren Sie Suchfunktionen in Rails