Java - Сеть

Термин « сетевое программирование» относится к написанию программ, которые выполняются на нескольких устройствах (компьютерах), в которых все устройства подключены друг к другу через сеть.

Пакет java.net API-интерфейсов J2SE содержит набор классов и интерфейсов, которые предоставляют детали низкоуровневого взаимодействия, позволяя вам писать программы, которые сосредоточены на решении возникшей проблемы.

Пакет java.net обеспечивает поддержку двух распространенных сетевых протоколов -

  • TCP- TCP означает протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.

  • UDP - UDP - это протокол дейтаграмм пользователя, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.

Эта глава дает хорошее понимание следующих двух тем:

  • Socket Programming - Это наиболее широко используемое понятие в сети, и оно было объяснено очень подробно.

  • URL Processing- Об этом будет рассказано отдельно. Щелкните здесь, чтобы узнать об обработке URL-адресов на языке Java.

Программирование сокетов

Сокеты обеспечивают механизм связи между двумя компьютерами с использованием TCP. Клиентская программа создает сокет на своем конце связи и пытается подключить этот сокет к серверу.

Когда соединение установлено, сервер создает объект сокета на своем конце связи. Теперь клиент и сервер могут обмениваться данными посредством записи в сокет и чтения из него.

Класс java.net.Socket представляет сокет, а класс java.net.ServerSocket предоставляет механизм для серверной программы, чтобы слушать клиентов и устанавливать с ними соединения.

Следующие шаги происходят при установлении TCP-соединения между двумя компьютерами с использованием сокетов:

  • Сервер создает экземпляр объекта ServerSocket, обозначающего, по какому номеру порта должна происходить связь.

  • Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу на заданном порту.

  • После ожидания сервером клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.

  • Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный взаимодействовать с сервером.

  • На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к сокету клиента.

После того, как соединения установлены, связь может происходить с использованием потоков ввода-вывода. Каждый сокет имеет как OutputStream, так и InputStream. Клиентский поток OutputStream подключен к InputStream сервера, а клиентский InputStream подключен к OutputStream сервера.

TCP - это протокол двусторонней связи, поэтому данные могут отправляться через оба потока одновременно. Ниже приведены полезные классы, предоставляющие полный набор методов для реализации сокетов.

Методы класса ServerSocket

В java.net.ServerSocket Класс используется серверными приложениями для получения порта и прослушивания клиентских запросов.

Класс ServerSocket имеет четыре конструктора -

Sr. No. Метод и описание
1

public ServerSocket(int port) throws IOException

Пытается создать серверный сокет, привязанный к указанному порту. Исключение возникает, если порт уже привязан к другому приложению.

2

public ServerSocket(int port, int backlog) throws IOException

Как и в предыдущем конструкторе, параметр backlog указывает, сколько входящих клиентов хранить в очереди ожидания.

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, позволяя серверу указывать, на каком из своих IP-адресов принимать запросы клиентов.

4

public ServerSocket() throws IOException

Создает несвязанный серверный сокет. При использовании этого конструктора используйте метод bind (), когда будете готовы привязать сокет сервера.

Если конструктор ServerSocket не генерирует исключение, это означает, что ваше приложение успешно привязано к указанному порту и готово для клиентских запросов.

Ниже приведены некоторые из общих методов класса ServerSocket.

Sr. No. Метод и описание
1

public int getLocalPort()

Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт за вас.

2

public Socket accept() throws IOException

Ожидает входящего клиента. Этот метод блокируется до тех пор, пока либо клиент не подключится к серверу через указанный порт, либо время ожидания сокета не истечет, предполагая, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок.

3

public void setSoTimeout(int timeout)

Устанавливает значение тайм-аута, определяющее, как долго серверный сокет ожидает клиента во время accept ().

4

public void bind(SocketAddress host, int backlog)

Привязывает сокет к указанному серверу и порту в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов.

Когда ServerSocket вызывает accept (), метод не возвращается, пока клиент не подключится. После подключения клиента ServerSocket создает новый Socket на неуказанном порту и возвращает ссылку на этот новый Socket. Теперь между клиентом и сервером существует TCP-соединение, и связь может начаться.

Методы класса сокета

В java.net.SocketКласс представляет сокет, который и клиент, и сервер используют для связи друг с другом. Клиент получает объект Socket, создав его экземпляр, тогда как сервер получает объект Socket из возвращаемого значения метода accept ().

Класс Socket имеет пять конструкторов, которые клиент использует для подключения к серверу:

Sr. No. Метод и описание
1

public Socket(String host, int port) throws UnknownHostException, IOException.

Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не генерирует исключение, соединение установлено успешно и клиент подключен к серверу.

2

public Socket(InetAddress host, int port) throws IOException

Этот метод идентичен предыдущему конструктору, за исключением того, что узел обозначается объектом InetAddress.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

Подключается к указанному хосту и порту, создавая сокет на локальном хосте по указанному адресу и порту.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

Этот метод идентичен предыдущему конструктору, за исключением того, что узел обозначается объектом InetAddress вместо String.

5

public Socket()

Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу.

Когда конструктор Socket возвращается, он не просто создает экземпляр объекта Socket, но фактически пытается подключиться к указанному серверу и порту.

Некоторые методы, представляющие интерес в классе Socket, перечислены здесь. Обратите внимание, что и клиент, и сервер имеют объект Socket, поэтому эти методы могут быть вызваны как клиентом, так и сервером.

Sr. No. Метод и описание
1

public void connect(SocketAddress host, int timeout) throws IOException

Этот метод подключает сокет к указанному хосту. Этот метод необходим только тогда, когда вы создаете экземпляр Socket с помощью конструктора без аргументов.

2

public InetAddress getInetAddress()

Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет.

3

public int getPort()

Возвращает порт, к которому привязан сокет на удаленной машине.

4

public int getLocalPort()

Возвращает порт, к которому привязан сокет на локальном компьютере.

5

public SocketAddress getRemoteSocketAddress()

Возвращает адрес удаленного сокета.

6

public InputStream getInputStream() throws IOException

Возвращает входной поток сокета. Входной поток подключается к выходному потоку удаленного сокета.

7

public OutputStream getOutputStream() throws IOException

Возвращает выходной поток сокета. Выходной поток подключается к входному потоку удаленного сокета.

8

public void close() throws IOException

Закрывает сокет, из-за чего этот объект Socket больше не может повторно подключаться к какому-либо серверу.

Методы класса InetAddress

Этот класс представляет адрес Интернет-протокола (IP). Вот следующие полезные методы, которые вам понадобятся при программировании сокетов:

Sr. No. Метод и описание
1

static InetAddress getByAddress(byte[] addr)

Возвращает объект InetAddress по необработанному IP-адресу.

2

static InetAddress getByAddress(String host, byte[] addr)

Создает InetAddress на основе предоставленного имени хоста и IP-адреса.

3

static InetAddress getByName(String host)

Определяет IP-адрес хоста по имени хоста.

4

String getHostAddress()

Возвращает строку IP-адреса в текстовом представлении.

5

String getHostName()

Получает имя хоста для этого IP-адреса.

6

static InetAddress InetAddress getLocalHost()

Возвращает локальный хост.

7

String toString()

Преобразует этот IP-адрес в строку.

Пример Socket Client

Следующий GreetingClient - это клиентская программа, которая подключается к серверу с помощью сокета и отправляет приветствие, а затем ожидает ответа.

пример

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Пример сервера сокетов

Следующая программа GreetingServer является примером серверного приложения, которое использует класс Socket для прослушивания клиентов по номеру порта, указанному аргументом командной строки:

пример

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Скомпилируйте клиент и сервер, а затем запустите сервер следующим образом:

$ java GreetingServer 6066
Waiting for client on port 6066...

Проверьте клиентскую программу следующим образом -

Вывод

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!