English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Учебник по основам Java

Java Управление потоком

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java List (список)

Java Queue (очередь)

Java Map集合

Java Set集合

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Java сетевая программирование

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

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

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

  • TCP:TCP (Transmission Control Protocol, протокол управления передачей) — это протокол связи на уровне передачи, ориентированный на соединение, надежный и основанный на потоке данных. Уровень TCP расположен над уровнем IP и под уровнем приложения. TCP обеспечивает надежную связь между двумя приложениями. Обычно используется в интернет-протоколах и называется TCP/IP.

  • UDP:UDP (User Datagram Protocol, протокол пользователя данных) расположен на уровне передачи OSI. Это протокол без соединения. Предоставляет приложениям данные报 для передачи. Из-за отсутствия надежности и безсоединения UDP приложения обычно должны терпеть некоторые потерянные, ошибочные или повторяющиеся пакеты.

Этот учебник principalmente объясняет следующие две темы.

  • Программирование Socket:Это наиболее широко используемый концепт в сети, который был изложен очень подробно.

  • Обработка URL:Эта часть будет рассмотрена в другой статье, нажмите здесь для получения более подробной информации о Обработка URL на языке Java.

Программирование Socket

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

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

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

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

  • Создайте объект ServerSocket, представляющий собой сокет для общения через порт на сервере.

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

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

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

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

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

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

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

Серверное приложение использует класс java.net.ServerSocket для получения порта и侦听 клиентских запросов.

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

НомерОписание метода
1public ServerSocket(int port) throws IOException
Создайте серверный сокет, привязанный к конкретному порту.
2public ServerSocket(int port, int backlog) throws IOException
Создайте серверный сокет с указанным backlog и привяжите его к указанному локальному порту.
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Создайте сервер, используя указанный порт,侦听 backlog и локальный IP-адрес, к которому он будет привязан.
4public ServerSocket() throws IOException
Создание не привязанного серверного сокета.

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

Вот несколько常用的 методов класса ServerSocket:

НомерОписание метода
1public int getLocalPort()
  Возврат порта, на котором侦чивается этот сокет.
2public Socket accept() throws IOException
Слушание и принятие подключения к этому сокету.
3public void setSoTimeout(int timeout)
 Включение/отключение SO_TIMEOUT с помощью значения времени ожидания, выраженного в миллисекундах.
4public void bind(SocketAddress host, int backlog)
Привязка ServerSocket к определенному адресу (IP-адрес и порт).

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

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

Класс Socket имеет пять конструкторов.

НомерОписание метода
1public Socket(String host, int port) throws UnknownHostException, IOException.
Создание потокового сокета и подключение его к указанному хосту на указанном порту.
2public Socket(InetAddress host, int port) throws IOException
Создание потокового сокета и подключение его к указанному IP-адресу на указанном порту.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Создание сокета и подключение его к указанному удаленному хосту на указанном удаленном порту.
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Создает套кет и подключает его к указанному удаленному адресу и порту.
5public Socket()
Создание не подключенного套кета через системный тип SocketImpl

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

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

НомерОписание метода
1public void connect(SocketAddress host, int timeout) throws IOException
Подключает этот套кет к серверу и specifies a timeout value.
2public InetAddress getInetAddress()
 Возвращает адрес подключения套кета.
3public int getPort()
Возвращает удаленный порт, к которому подключен этот套кет.
4public int getLocalPort()
Возвращает локальный порт, к которому привязан этот套кет.
5public SocketAddress getRemoteSocketAddress()
Возвращает адрес точки подключения套кета, если он не подключен,则在озвращает null.
6public InputStream getInputStream() throws IOException
Возвращает поток ввода этого套кета.
7public OutputStream getOutputStream() throws IOException
Возвращает поток вывода этого套кета.
8public void close() throws IOException
Закрытие этого套кета.

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

Этот класс представляет собой адрес интернет-протокола (IP). Ниже перечислены методы, которые могут быть полезны при программировании с использованием Socket:

НомерОписание метода
1static InetAddress getByAddress(byte[] addr)
Возвращает объект InetAddress при заданном исходном IP-адресе.
2static InetAddress getByAddress(String host, byte[] addr)
Создание InetAddress на основе предоставленного имени хоста и IP-адреса.
3static InetAddress getByName(String host)
Определить IP-адрес хоста для заданного имени хоста.
4String getHostAddress() 
Вернуть строку IP-адреса (в текстовом формате).
5String getHostName() 
 Получить имя хоста для этого IP-адреса.
6static InetAddress getLocalHost()
Вернуть локальный хост.
7String toString()
Преобразовать этот IP-адрес в строку.

Пример клиента Socket

Ниже приведен пример клиента GreetingClient, который через socket подключается к серверу, отправляет запрос и ждет ответа.

// Название файла 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("Подключен к хосту: " + serverName + " ,порт: " + port);
         Socket client = new Socket(serverName, port);
         System.out.println("Адрес удаленного хоста: " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
 
         out.writeUTF("Привет от " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         System.out.println("Ответ сервера: " + in.readUTF());
         client.close();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Пример сервера Socket

Ниже приведен пример программы GreetingServer, которая является серверным приложением, использующим Socket для监听从指定端口监听。

// Файл名 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("Ожидается удаленное соединение, порт: " + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("Адрес удаленного хоста:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Спасибо за соединение со мной:" + server.getLocalSocketAddress() + "\nПрощай!");
            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.run();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Компилируйте два вышеуказанных java файла и выполните следующие команды для запуска сервиса, используя порт 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
Ожидается удаленное соединение, порт: 6066...

Откройте новый командный окно и выполните следующие команды для запуска клиента:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
Соединение с хостом: localhost ,порт: 6066
Адрес удаленного хоста: localhost/127.0.0.1:6066
Ответ сервера: Спасибо за соединение со мной: /127.0.0.1:6066
Прощай!