Heim > Java > javaLernprogramm > Hauptteil

JAVA-7NIO之Socket/ServerSocket-Kanal

巴扎黑
Freigeben: 2017-06-26 09:58:01
Original
997 Leute haben es durchsucht

1. ServerSocketChannel

ServerSocketChannel in Java NIO ist ein Kanal, der neue eingehende TCP-Verbindungen überwachen kann, genau wie ServerSocket in Standard-IO. Die ServerSocketChannel-Klasse befindet sich im Paket java.nio.channels.

Öffnen Sie ServerSocketChannel

Öffnen Sie ServerSocketChannel, indem Sie die Methode ServerSocketChannel.open() aufrufen.

Schließen Sie ServerSocketChannel

Schließen Sie es, indem Sie die Methode ServerSocketChannel.close() ServerSocketChannel aufrufen .

Auf neue eingehende Verbindungen warten

Über die Methode ServerSocketChannel.accept() auf neue eingehende Verbindungen warten. Wenn die Methode „accept()“ zurückkehrt, gibt sie einen SocketChannel zurück, der die neue eingehende Verbindung enthält. Daher blockiert die Methode „accept()“, bis eine neue Verbindung eintrifft.

Normalerweise hört man nicht nur eine Verbindung ab und ruft in der while-Schleife die Methode „accept()“ auf.

Natürlich kann man in der while-Schleife auch andere Exit-Kriterien als „true“ verwenden .

Nicht blockierender Modus

ServerSocketChannel kann auf den nicht blockierenden Modus eingestellt werden. Im nicht blockierenden Modus kehrt die Methode „accept()“ sofort zurück. Wenn keine neue eingehende Verbindung vorliegt, ist der Rückgabewert null. Daher müssen Sie prüfen, ob der zurückgegebene SocketChannel null ist. Beispiel:

    /** * socket server channel     */@Testpublic void text2() throws IOException {
        ServerSocketChannel channel = ServerSocketChannel.open();    //新建channelchannel.socket().bind(new InetSocketAddress(9999));     //监听端口channel.configureBlocking(true);                             //设置阻塞while (true) {
            SocketChannel accept = channel.accept();                    //设置为阻塞,则此方法阻塞,直到有连接//如果设置为非阻塞,需要在这里判断 accept == null?ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            accept.read(byteBuffer);
            byteBuffer.flip();                                    //反转while (byteBuffer.hasRemaining()) {                   //判断System.err.println((char)byteBuffer.get());       //输出            }
        }
    }
Nach dem Login kopieren

2. SocketChannel

Der SocketChannel in Java NIO ist ein A-Kanal, der mit einem TCP-Netzwerk-Socket verbunden ist. SocketChannel kann auf zwei Arten erstellt werden:

  1. Öffnen Sie einen SocketChannel und stellen Sie eine Verbindung zu einem Server im Internet her.

  2. Wenn eine neue Verbindung bei ServerSocketChannel eintrifft, wird ein SocketChannel erstellt.

SocketChannel öffnen

So öffnen Sie SocketChannel:

SocketChannel schließen

Rufen Sie SocketChannel.close auf, wenn Sie mit SocketChannel fertig sind () SocketChannel schließen:

Daten aus SocketChannel lesen

Um Daten aus SocketChannel zu lesen, rufen Sie eine der read()-Methoden auf.

Zuerst weisen Sie einen Puffer zu. Die von SocketChannel gelesenen Daten werden in diesem Puffer abgelegt.

Dann rufen Sie SocketChannel.read() auf. Diese Methode liest Daten von SocketChannel in Buffer. Der von der Methode read() zurückgegebene int-Wert gibt an, wie viele Bytes in den Puffer eingelesen wurden. Wenn -1 zurückgegeben wird, bedeutet dies, dass das Ende des Streams gelesen wurde (die Verbindung wurde geschlossen).

In SocketChannel schreiben

Das Schreiben von Daten in SocketChannel verwendet die Methode SocketChannel.write(), die einen Puffer als Parameter verwendet.

Beachten Sie, dass die Methode SocketChannel.write() in einer While-Schleife aufgerufen wird. Die Methode Write() kann nicht garantieren, wie viele Bytes in den SocketChannel geschrieben werden können. Also rufen wir write() wiederholt auf, bis der Puffer keine Bytes mehr zum Schreiben hat.

Nicht blockierender Modus

Sie können SocketChannel in den nicht blockierenden Modus (nicht blockierenden Modus) versetzen. Nach der Einstellung können Sie connect(), read() und write() aufrufen Asynchroner Modus.

connect()

Wenn sich der SocketChannel im nicht blockierenden Modus befindet und connect() zu diesem Zeitpunkt aufgerufen wird, kehrt die Methode möglicherweise zurück, bevor die Verbindung hergestellt wird. Um festzustellen, ob die Verbindung hergestellt wurde, können Sie die Methode finishConnect() aufrufen.

write()

Im nicht blockierenden Modus kehrt die Methode write() möglicherweise zurück, bevor Inhalte geschrieben wurden. Daher muss write() in der Schleife aufgerufen werden. Es gab bereits Beispiele, daher werde ich hier nicht näher darauf eingehen.

read()

Im nicht blockierenden Modus kehrt die Methode read() möglicherweise zurück, bevor Daten gelesen wurden. Sie müssen also auf den Rückgabewert int achten, der Ihnen sagt, wie viele Bytes gelesen wurden.

Nicht blockierender Modus und Selektor

Der nicht blockierende Modus funktioniert besser mit dem Selektor. Durch die Registrierung eines oder mehrerer SocketChannels im Selektor können Sie den Selektor fragen, welcher Kanal zum Lesen und Schreiben bereit ist usw. Die Kombination von Selector und SocketChannel wird später ausführlich besprochen.

/** * socket channel     */@Testpublic void test3() throws IOException {
        SocketChannel channel = SocketChannel.open();                               //新建服务端channel.connect(new InetSocketAddress("127.0.0.1",9999));   //连接服务端地址ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区byteBuffer.put("123".getBytes());
        byteBuffer.flip();                                  //反转while (byteBuffer.hasRemaining()) {                 //判断            channel.write(byteBuffer);
        }
    }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonJAVA-7NIO之Socket/ServerSocket-Kanal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!