Java NIO - ServerSocket Channel
Der Java NIO-Server-Socket-Kanal ist wieder ein auswählbarer Typkanal, der für den Stream-orientierten Datenfluss verwendet wird, der Sockets verbindet. Der Server-Socket-Kanal kann durch Aufrufen seiner statischen Daten erstellt werden open() Methode, vorausgesetzt, ein bereits vorhandener Socket ist noch nicht vorhanden. Server-Socket-Kanal wird durch Aufrufen der offenen Methode erstellt, aber noch nicht gebunden. Um den Socket-Kanal zu binden bind() Methode ist aufzurufen.
Ein Punkt, der hier erwähnt werden muss, ist, wenn der Kanal nicht gebunden ist und versucht wird, eine E / A-Operation auszuführen, wird von diesem Kanal eine NotYetBoundException ausgelöst. Daher muss sichergestellt werden, dass der Kanal begrenzt ist, bevor eine E / A-Operation ausgeführt wird.
Eingehende Verbindungen für den Server-Socket-Kanal werden durch Aufrufen der ServerSocketChannel.accept () -Methode abgehört. Wenn die accept () -Methode zurückgegeben wird, gibt sie einen SocketChannel mit einer eingehenden Verbindung zurück. Daher blockiert die Methode accept (), bis eine eingehende Verbindung eintrifft. Wenn sich der Kanal im nicht blockierenden Modus befindet, gibt die Methode accept sofort null zurück, wenn keine ausstehenden Verbindungen vorhanden sind. Andernfalls wird es auf unbestimmte Zeit blockiert, bis eine neue Verbindung verfügbar ist oder ein E / A-Fehler auftritt.
Der Sockel des neuen Kanals ist zunächst ungebunden. Es muss über eine der Bindemethoden seines Sockets an eine bestimmte Adresse gebunden werden, bevor Verbindungen akzeptiert werden können. Außerdem wird der neue Kanal durch Aufrufen der openServerSocketChannel-Methode des systemweiten Standardobjekts SelectorProvider erstellt.
Wie Socket Channel Server Socket Channel könnte Daten mit lesen read()Methode. Zunächst wird der Puffer zugewiesen. Die von einem ServerSocketChannel gelesenen Daten werden im Puffer gespeichert. Zweitens rufen wir die ServerSocketChannel.read () -Methode auf und lesen die Daten von einem ServerSocketChannel in einen Puffer. Der ganzzahlige Wert der read () -Methode gibt zurück, wie viele Bytes in den Puffer geschrieben wurden
In ähnlicher Weise könnten Daten mit in den Server-Socket-Kanal geschrieben werden write() Methode, die Puffer als Parameter verwendet. Verwendet üblicherweise die Schreibmethode in einer while-Schleife, um die write () -Methode zu wiederholen, bis für den Puffer keine weiteren Bytes zum Schreiben verfügbar sind.
Wichtige Methoden des Socket-Kanals
bind(SocketAddress local) - Diese Methode wird verwendet, um den Socket-Kanal an die lokale Adresse zu binden, die als Parameter für diese Methode angegeben wird.
accept() - Mit dieser Methode wird eine Verbindung zum Socket dieses Kanals akzeptiert.
connect(SocketAddress remote) - Mit dieser Methode wird der Socket mit der Remote-Adresse verbunden.
finishConnect() - Mit dieser Methode wird der Vorgang zum Anschließen eines Socket-Kanals abgeschlossen.
getRemoteAddress() - Diese Methode gibt die Adresse des Remote-Standorts zurück, an den der Socket des Kanals angeschlossen ist.
isConnected() - Wie bereits erwähnt, gibt diese Methode den Verbindungsstatus des Socket-Kanals zurück, dh ob dieser angeschlossen ist oder nicht.
open() - Die Open-Methode wird verwendet, um einen Socket-Kanal für keine angegebene Adresse zu öffnen. Diese Convenience-Methode funktioniert so, als würde die open () -Methode aufgerufen, die Connect-Methode für den resultierenden Server-Socket-Kanal aufgerufen, ihn remote übergeben und dieser Kanal dann zurückgegeben.
read(ByteBuffer dst) - Diese Methode wird verwendet, um Daten aus dem angegebenen Puffer über den Socket-Kanal zu lesen.
setOption(SocketOption<T> name, T value) - Diese Methode legt den Wert einer Socket-Option fest.
socket() - Diese Methode ruft einen diesem Kanal zugeordneten Server-Socket ab.
validOps() - Diese Methode gibt einen Operationssatz zurück, der die unterstützten Operationen dieses Kanals identifiziert. Server-Socket-Kanäle unterstützen nur das Akzeptieren neuer Verbindungen, daher gibt diese Methode SelectionKey.OP_ACCEPT zurück.
Beispiel
Das folgende Beispiel zeigt, wie Daten von Java NIO ServerSocketChannel gesendet werden.
C: /Test/temp.txt
Hello World!
Client: SocketChannelClient.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;
public class SocketChannelClient {
public static void main(String[] args) throws IOException {
ServerSocketChannel serverSocket = null;
SocketChannel client = null;
serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(9000));
client = serverSocket.accept();
System.out.println("Connection Set: " + client.getRemoteAddress());
Path path = Paths.get("C:/Test/temp1.txt");
FileChannel fileChannel = FileChannel.open(path,
EnumSet.of(StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE)
);
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(client.read(buffer) > 0) {
buffer.flip();
fileChannel.write(buffer);
buffer.clear();
}
fileChannel.close();
System.out.println("File Received");
client.close();
}
}
Ausgabe
Wenn Sie den Client ausführen, wird nichts gedruckt, bis der Server gestartet wird.
Server: SocketChannelServer.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SocketChannelServer {
public static void main(String[] args) throws IOException {
SocketChannel server = SocketChannel.open();
SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
server.connect(socketAddr);
Path path = Paths.get("C:/Test/temp.txt");
FileChannel fileChannel = FileChannel.open(path);
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(fileChannel.read(buffer) > 0) {
buffer.flip();
server.write(buffer);
buffer.clear();
}
fileChannel.close();
System.out.println("File Sent");
server.close();
}
}
Ausgabe
Wenn Sie den Server ausführen, wird Folgendes gedruckt.
Connection Set: /127.0.0.1:49558
File Received