Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Java — Сеть

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<тд>

public ServerSocket(int port) генерирует исключение IOException

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

<тд>

public ServerSocket(int port, int backlog) вызывает исключение IOException

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

<тд>

public ServerSocket(int port, int backlog, InetAddress address) выдает исключение IOException

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

<тд>

public ServerSocket() генерирует исключение IOException

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

Сер.№ Метод и описание
1
2
3
4

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

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

<тд>

public int getLocalPort()

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

<тд>

общедоступный сокет accept() вызывает исключение IOException

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

<тд>

public void setSoTimeout(int timeout)

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

<тд>

public void bind(хост SocketAddress, int backlog)

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

Сер.№ Метод и описание
1
2
3
4

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

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

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

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

<тд>

public Socket(String host, int port) генерирует UnknownHostException, IOException.

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

<тд>

общедоступный сокет (хост InetAddress, порт int) генерирует исключение IOException

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

<тд>

public Socket(String host, int port, InetAddress localAddress, int localPort) вызывает исключение IOException.

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

<тд>

общедоступный сокет (хост InetAddress, порт int, локальный адрес InetAddress, локальный порт int) вызывает исключение IOException.

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

<тд>

общедоступный сокет()

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

Сер.№ Метод и описание
1
2
3
4
5

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

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

<тд>

public void connect(хост SocketAddress, тайм-аут int) вызывает исключение IOException

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

<тд>

публичный InetAddress getInetAddress()

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

<тд>

общедоступный порт getPort()

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

<тд>

public int getLocalPort()

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

<тд>

общедоступный адрес сокета getRemoteSocketAddress()

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

<тд>

public InputStream getInputStream() вызывает исключение IOException

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

<тд>

public OutputStream getOutputStream() вызывает исключение IOException

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

<тд>

public void close() вызывает исключение IOException

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

Сер.№ Метод и описание
1
2
3
4
5
6
7
8

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

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

<тд>

статический InetAddress getByAddress(byte[] addr)

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

<тд>

статический InetAddress getByAddress(String host, byte[] addr)

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

<тд>

статический InetAddress getByName(String host)

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

<тд>

Строка getHostAddress()

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

<тд>

Строка getHostName()

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

<тд>

статический InetAddress InetAddress getLocalHost()

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

<тд>

Строка toString()

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

Сер.№ Метод и описание
1
2
3
4
5
6
7

Пример сокет-клиента

Следующий 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!

java

  1. Операторы Java
  2. Java-комментарии
  3. Java для каждого цикла
  4. Java-строки
  5. Java-интерфейс
  6. Анонимный класс Java
  7. Java-проба с ресурсами
  8. Java-аннотации
  9. Утверждения Java
  10. Java вектор