Учебники

Java NIO – Сокет Канал

Канал сокетов Java NIO – это канал выбираемого типа, который означает, что его можно мультиплексировать с помощью селектора, используемого для потоковых сокетов, соединяющих сокеты. Канал сокетов можно создать, вызвав его статический метод open () , при условии, что любой ранее существующий сокет еще не создан. present.Socket канал создается с помощью вызова метода open, но еще не подключен. Для подключения к сокету канал должен быть вызван метод connect (). Здесь следует упомянуть, что канал не подключен и выполняется попытка операции ввода-вывода. чтобы быть предпринятым, NotYetConnectedException генерируется этим каналом. Поэтому необходимо убедиться, что канал подключен до выполнения какой-либо операции ввода-вывода. Как только канал подключается, он остается подключенным, пока не будет закрыт. Состояние сокетного канала может быть определено путем вызова его метод isConnected .

Соединение канала сокета можно завершить, вызвав его метод finishConnect (). Можно ли определить, выполняется ли операция соединения или нет, путем вызова метода isConnectionPending. Канал сокета по умолчанию поддерживает неблокирующее соединение. Также поддерживается асинхронное отключение, которая похожа на асинхронную операцию закрытия, указанную в классе Channel.

Сокетные каналы безопасны для использования несколькими параллельными потоками. Они поддерживают одновременное чтение и запись, хотя не более одного потока может читать и не более одного потока может писать в любой момент времени. Методы connect и finishConnect взаимно синхронизируются друг с другом, и попытка инициировать операцию чтения или записи во время выполнения одного из этих методов будет блокироваться до тех пор, пока этот вызов не будет завершен.

Важные методы сокета канала

  • bind (SocketAddress local) – этот метод используется для привязки канала сокета к локальному адресу, который предоставляется в качестве параметра для этого метода.

  • connect (SocketAddress remote) – этот метод используется для подключения сокета к удаленному адресу.

  • finishConnect () – Этот метод используется для завершения процесса подключения канала сокета.

  • getRemoteAddress () – Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.

  • isConnected () – как уже упоминалось, этот метод возвращает статус подключения сокетного канала, т. е. подключен он или нет.

  • open () и open ((SocketAddress remote) – метод Open используется для открытия канала сокета без указанного адреса, в то время как параметризованный метод open открывает канал для указанного удаленного адреса и также подключается к нему. Этот удобный метод работает так, как если бы вызывал open ( ), вызывая метод connect для полученного канала сокета, передавая его удаленно, а затем возвращая этот канал.

  • read (ByteBuffer dst) – этот метод используется для чтения данных из данного буфера через канал сокета.

  • isConnectionPending () – Этот метод сообщает, выполняется или нет операция соединения на этом канале.

bind (SocketAddress local) – этот метод используется для привязки канала сокета к локальному адресу, который предоставляется в качестве параметра для этого метода.

connect (SocketAddress remote) – этот метод используется для подключения сокета к удаленному адресу.

finishConnect () – Этот метод используется для завершения процесса подключения канала сокета.

getRemoteAddress () – Этот метод возвращает адрес удаленного местоположения, к которому подключен сокет канала.

isConnected () – как уже упоминалось, этот метод возвращает статус подключения сокетного канала, т. е. подключен он или нет.

open () и open ((SocketAddress remote) – метод Open используется для открытия канала сокета без указанного адреса, в то время как параметризованный метод open открывает канал для указанного удаленного адреса и также подключается к нему. Этот удобный метод работает так, как если бы вызывал open ( ), вызывая метод connect для полученного канала сокета, передавая его удаленно, а затем возвращая этот канал.

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();
   }
}

Выход

Запустив сервер напечатает следующее.