Versuchen Sie, TCP / IP + NIO mit JAVA zu implementieren

Dieser Artikel verwendet Java 10.0.1, das auf WIN10 installiert ist.

zunaechst

Das letzte Mal ich habe einen BIO-Übertragungspfad erstellt werde ich heute NIO weiter implementieren.

Über NIO

Was ist NIO?

Einfach ausgedrückt, blockiert es keine E / A-Anforderungen. Sie können die vorhandene E / A-Verarbeitung (BIO) verbessern.

Schlechte Punkte von BIO

Erstens sind für die Anforderung von der Client-Seite zwei Teile enthalten, eine Verbindungsanforderung und eine E / A-Anforderung. Verbindungsanfragen werden immer gestellt, aber E / A-Anfragen werden von Zeit zu Zeit gestellt. Daher verschwendet das Verfahren zum Vorbereiten eines Verarbeitungsthreads unabhängig von einer Anforderung, unabhängig davon, ob eine E / A-Verarbeitung wie BIO vorliegt oder nicht, die Leistung des Servers.

Gute Punkte von NIO

NIO hat nur einen Verarbeitungsthread für jede Anforderung von der Clientseite. Wenn eine E / A-Anforderung vorliegt, fragen Sie einen anderen Thread nach der E / A-Verarbeitung.

Implementierung

*** SocketChannel *** und *** ServerSocketChannel *** werden aus der Java-Sprache bereitgestellt, daher werde ich dieses Mal versuchen, TCP / IP + NIO mit diesen zu implementieren. (Die offizielle API finden Sie hier: SocketChannel, [ServerSocketChannel](https: // docs .oracle.com / javase / jp / 8 / docs / api / java / nio / channel / ServerSocketChannel.html) Serverseitige Dateien

** Inhalt von ChannelServer.java **

public class ChannelServer {

    public static void main(String[] args) throws IOException {
        // I/Bereiten Sie einen Thread-Pool vor, um O-Anforderungen zu verarbeiten
        ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 10, 1000, TimeUnit.MILLISECONDS, 
                new ArrayBlockingQueue<Runnable>(100));

        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(1234));

        while (true) {
            SocketChannel socketChannel = serverSocketChannel.accept();

            if (socketChannel != null) {
                //Übertragen Sie die Anforderung in den Thread-Pool
                executor.submit(new ChannelServerThread(socketChannel));
            }
        }
    }
}

** Inhalt von ChannelServer.java **

*** Thread zur Bearbeitung der Anfrage ***


public class ChannelServerThread implements Runnable {

    private SocketChannel socketChannel;
    private String remoteName;

    public ChannelServerThread(SocketChannel socketChannel) throws IOException {
        this.socketChannel = socketChannel;
        this.remoteName = socketChannel.getRemoteAddress().toString();
        System.out.println("client:" + remoteName + " access successfully!");
    }

    // I/O-Anfrage bearbeiten
    @Override
    public void run() {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ByteBuffer sizeBuffer = ByteBuffer.allocate(4);
        StringBuilder sb = new StringBuilder();
        byte b[];
        //Lesen Sie Daten und Länge von socketChannel und geben Sie sie in die Standardausgabe aus
        while(true) {
            try {
                sizeBuffer.clear();
                int read = socketChannel.read(sizeBuffer);
                if (read != -1) {
                    sb.setLength(0);
                    sizeBuffer.flip();
                    int size = sizeBuffer.getInt();
                    int readCount = 0;
                    b = new byte[1024];
                    while (readCount < size) {
                        buffer.clear();
                        read = socketChannel.read(buffer);
                        if (read != -1) {
                            readCount += read;
                            buffer.flip();
                            int index = 0 ;
                            while(buffer.hasRemaining()) {
                                b[index++] = buffer.get();
                                if (index >= b.length) {
                                    index = 0;
                                    sb.append(new String(b,"UTF-8"));
                                }
                            }
                            if (index > 0) {
                                sb.append(new String(b,"UTF-8"));
                            }
                        }
                    }
                    System.out.println(remoteName +  ":" + sb.toString());
                }
            } catch (Exception e) {
                System.out.println(remoteName + "access colsed");
                try {
                    socketChannel.close();
                } catch (IOException ex) {
                }
                break;
            }
        }
    }
}

** Clientseitige Dateien **

*** Erstellen Sie einen SocketChannel, um auf den angegebenen Server und Port zuzugreifen. ***

public class ChannelClient {

    public static void main(String[] args) throws IOException {

        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress(1234));
        while (true) {
            Scanner sc = new Scanner(System.in);
            String next = sc.next();
            sendMessage(socketChannel, next);
        }
    }

    //Bereiten Sie einen Container für Channel to IPO vor
    public static void sendMessage(SocketChannel socketChannel, String mes) throws IOException {
        if (mes == null || mes.isEmpty()) {
            return;
        }
        byte[] bytes = mes.getBytes("UTF-8");
        int size = bytes.length;
        ByteBuffer buffer = ByteBuffer.allocate(size);
        ByteBuffer sizeBuffer = ByteBuffer.allocate(4);

        sizeBuffer.putInt(size);
        buffer.put(bytes);

        buffer.flip();
        sizeBuffer.flip();
        ByteBuffer dest[] = {sizeBuffer,buffer};
        while (sizeBuffer.hasRemaining() || buffer.hasRemaining()) {
            socketChannel.write(dest);
        }
    }
}

Ergebnisauthentifizierung

*** Starten des Servers und Warten auf eine Verbindung: ***

Server

PS C:\Users\ma\Documents\work\socket\nio_tcp> java ChannelServer

*** Starten Sie die Clients 1 und 2 und geben Sie Folgendes ein: ***

** Kunde 1 **


PS C:\Users\ma\Documents\work\socket\nio_tcp> java ChannelClient
iamfirstuser!
byebyefirstone!
Exception in thread "main"
PS C:\Users\ma\Documents\work\socket\nio_tcp>

** Client 2 **

java ChannelClient
iamseconduser
byebyesecondone!
Exception in thread "main"
PS C:\Users\ma\Documents\work\socket\nio_tcp>

Server


PS C:\Users\ma\Documents\work\socket\nio_tcp> java ChannelServer
client:/192.168.56.1:50138 access successfully!
client:/192.168.56.1:50139 access successfully!
/192.168.56.1:50138:iamfirstuser!
/192.168.56.1:50139:iamseconduser
/192.168.56.1:50138:byebyefirstone!
/192.168.56.1:50138access colsed
/192.168.56.1:50139:byebyesecondone!
/192.168.56.1:50139access colsed

Zusammenfassung

Dieses Mal habe ich einen TCP / IP + NIO-Übertragungspfad mit den Bibliotheken SocketChannel und ServerSocketChannel von Java erstellt. Wir konnten auch authentifizieren, dass ein Server mehrere Anforderungen gleichzeitig verarbeiten kann.

Recommended Posts

Versuchen Sie, TCP / IP + NIO mit JAVA zu implementieren
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java] Versuchen Sie, mithilfe von Generika zu implementieren
Versuchen Sie, Yuma in Java zu implementieren
Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie, eine Anmeldefunktion mit Spring-Boot zu implementieren
Versuchen Sie, Ruby und Java in Dapr zu integrieren
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
Versuchen Sie gRPC mit Java, Maven
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
[Java] So implementieren Sie Multithreading
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Java mit Ramen lernen [Teil 1]
[Java EE] Implementieren Sie den Client mit WebSocket
Versuchen Sie, Yuma in Ruby zu implementieren
[Java] Mit Arrays.asList () zu beachtende Punkte
Versuchen Sie, die iOS14-Widget-Funktion zu implementieren
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Versuchen Sie es mit Redis mit Java (jar)
Ich habe versucht, mit Java zu interagieren
Versuchen Sie, die öffentliche Java-Methode zu extrahieren
Versuchen Sie die bidirektionale Kommunikation mit gRPC Java
Java, Arrays für Anfänger
Versuchen Sie, den Start von Java-Konsolenprogrammen mit dem nativen Image von GraalVM zu beschleunigen
Schnittstelle Versuchen Sie, Java-Problem TypeScript 7-3 zu machen
So implementieren Sie die Datumsberechnung in Java
Versuchen Sie, Project Euler in Java zu lösen
So kompilieren Sie Java mit VsCode & Ant
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
Probieren wir WebSocket mit Java und Javascript aus!
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
So erzwingen Sie Codierungskonventionen in Java
So implementieren Sie TextInputLayout mit Validierungsfunktion
Versuchen Sie, Java-Bibliotheken mit AWS CodeArtifact zu verwalten
Einfach mit regulären Java-Ausdrücken zu stolpern
Versuchen Sie es mit der Wii-Fernbedienung in Java
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
Versuchen Sie, mit JDK6 (Java) + JDBC OCI-Treiber (Typ 2) eine Verbindung zur autonomen Datenbank herzustellen.
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
Schreiben wir die Eingabe / Ausgabe von Java-Dateien mit NIO
[Java] So testen Sie, ob es in JUnit null ist
Versuchen Sie, eine Java 8-Umgebung unter Amazon Linux2 zu erstellen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Stellen Sie Java-Webanwendungen mit maven in Azure bereit
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Verwendung des Java-Frameworks mit AWS Lambda! ??
Inkrementierungsverhalten Versuchen Sie, Java zum Problem TypeScript 3-4 zu machen
Ich möchte Java8 für jeden mit Index verwenden
Zeichenfolgenoperation Versuchen Sie, das Java-Problem in TypeScript 9-3 zu ändern
Verwendung der Java-API mit Lambda-Ausdrücken
Erste Schritte mit Kotlin zum Senden an Java-Entwickler