Java NIO - канал сокета
Канал сокета Java NIO - это канал выбираемого типа, что означает, что он может быть мультиплексирован с помощью селектора, используемого для потоковых потоков данных, соединяющих сокеты. Канал сокета может быть создан путем вызова его статического open() при условии, что какой-либо ранее существующий сокет еще не присутствует. канал сокета создается путем вызова метода open, но еще не подключен. для подключения канала сокета connect() Здесь следует упомянуть один момент: если канал не подключен и предпринимается попытка выполнения какой-либо операции ввода-вывода, то этим каналом генерируется NotYetConnectedException. Как только канал подключен, он остается подключенным до тех пор, пока не будет закрыт. Состояние канала сокета можно определить, вызвав его isConnected метод.
Подключение канала сокета можно завершить, вызвав его finishConnect() Выполняется ли операция подключения, можно определить, вызвав метод isConnectionPending. По умолчанию канал сокета поддерживает неблокирующее соединение. Также он поддерживает асинхронное завершение работы, которое аналогично операции асинхронного закрытия, указанной в классе Channel.
Каналы сокетов безопасны для использования несколькими параллельными потоками. Они поддерживают одновременное чтение и запись, хотя максимум один поток может читать и максимум один поток может писать в любой момент времени. Методы connect и finishConnect взаимно синхронизируются друг с другом, и попытка инициировать операцию чтения или записи, пока выполняется вызов одного из этих методов, будет блокироваться до тех пор, пока этот вызов не будет завершен.
Важные методы Socket channel
bind(SocketAddress local) - Этот метод используется для привязки канала сокета к локальному адресу, который предоставляется в качестве параметра для этого метода.
connect(SocketAddress remote) - Этот метод используется для подключения сокета к удаленному адресу.
finishConnect() - Этот метод используется для завершения процесса подключения канала сокета.
getRemoteAddress() - Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.
isConnected() - Как уже упоминалось, этот метод возвращает статус подключения канала сокета, то есть подключен он или нет.
open() and open((SocketAddress remote) - Открытый метод используется для открытия канала сокета без указанного адреса, в то время как параметризованный открытый метод открывает канал для указанного удаленного адреса, а также подключается к нему. Этот удобный метод работает так, как если бы вызывая метод open (), вызывая метод подключения после полученного результата. канал сокета, передавая его удаленно, а затем возвращая этот канал.
read(ByteBuffer dst) - Этот метод используется для чтения данных из заданного буфера через канал сокета.
isConnectionPending() - Этот метод сообщает, выполняется ли операция подключения на этом канале.
пример
В следующем примере показано, как отправлять данные из Java NIO SocketChannel.
C: /Test/temp.txt
Hello World!
Клиент: 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();
}
}
Вывод
Запуск клиента ничего не напечатает, пока сервер не запустится.
Сервер: 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();
}
}
Вывод
Запуск сервера напечатает следующее.
Connection Set: /127.0.0.1:49558
File Received