Сетевое программирование на Java
Сетевое программирование — это написание программ, которые работают на нескольких устройствах (компьютерах), все из которых соединены через сеть.
API J2SE в пакете java.net содержат классы и интерфейсы, которые предоставляют низкоуровневые детали связи. Вы можете использовать эти классы и интерфейсы напрямую, чтобы сосредоточиться на решении задач, не беспокоясь о деталях связи.
Пакет java.net обеспечивает поддержку двух распространённых сетевых протоколов:
TCP: TCP (Transmission Control Protocol) — это протокол связи транспортного уровня с установлением соединения, надёжный и основанный на потоке байтов. Уровень TCP — это промежуточный уровень, расположенный выше уровня IP и ниже прикладного уровня. TCP обеспечивает надёжную связь между двумя приложениями. Он обычно используется для интернет-протоколов и называется TCP/IP.
UDP: UDP (User Datagram Protocol) находится на транспортном уровне модели OSI. Это протокол без установления соединения. Он предоставляет датаграммы для отправки данных между приложениями. Поскольку UDP не обеспечивает надёжность и является протоколом без установления соединения, приложения обычно должны допускать некоторые потерянные, ошибочные или дублирующиеся пакеты.
В этом руководстве в основном объясняются следующие две темы.
Программирование сокетов: Это наиболее широко используемая концепция сетевого взаимодействия, и она была подробно объяснена.
Обработка URL: Эта часть будет рассмотрена в отдельном разделе. Нажмите здесь, чтобы узнать больше об обработкеURL в языке Java.。
Программирование сокетов
Сокеты используют TCP для обеспечения механизма связи между двумя компьютерами. Клиентская программа создает сокет и пытается подключиться к сокету сервера.
Когда соединение установлено, сервер создает объект Socket. Теперь клиент и сервер могут обмениваться данными, записывая в объекты Socket и читая из них.
Класс java.net.Socket представляет сокет, а класс java.net.ServerSocket предоставляет механизм для серверных программ, позволяющий прослушивать клиентов и устанавливать с ними соединения.
При установлении TCP-соединения между двумя компьютерами с использованием сокетов выполняются следующие шаги:
Сервер создает объект ServerSocket, указывая связь через порт на сервере.
Сервер вызывает метод accept() класса ServerSocket, который будет ждать, пока клиент подключится к заданному порту на сервере.
Пока сервер ожидает, клиент создает объект Socket, указывая имя сервера и номер порта для запроса соединения.
Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, на клиенте создается объект Socket, который может взаимодействовать с сервером.
На стороне сервера метод accept() возвращает новую ссылку на сокет на сервере, которая подключена к сокету клиента.
После установления соединения обмен данными осуществляется с помощью потоков ввода-вывода. Каждый сокет имеет выходной поток и входной поток. Выходной поток клиента подключается к входному потоку сервера, а выходной поток клиента подключается к выходному потоку сервера.
TCP — двунаправленный протокол связи, данные могут передаваться по обоим потокам данных одновременно. Ниже приведены некоторые классы, предоставляющие полный набор полезных методов для реализации сокетов.
Класс ServerSocket
Серверные приложения используют класс java.net.ServerSocket, чтобы получить порт и прослушивать запросы клиентов.
Класс ServerSocket имеет четыре конструктора:
| Нет. | Описание метода |
| 1 |
public ServerSocket(int port) throws IOException Создаёт серверный сокет, привязанный к определённому порту. |
| 2 |
public ServerSocket(int port, int backlog) throws IOException Создаёт серверный сокет с указанной очередью ожидания и привязывает его к указанному номеру локального порта. |
| 3 |
public ServerSocket(int port, int backlog, InetAddress address) throws IOException Создаёт сервер, используя указанный порт, очередь ожидания прослушивания и локальный IP-адрес для привязки. |
| 4 |
public ServerSocket() throws IOException Создает непривязанный серверный сокет. |
Создает непривязанный серверный сокет. Если конструктор ServerSocket не выбрасывает исключение, это означает, что ваше приложение успешно привязалось к указанному порту и прослушивает клиентские запросы.
Вот некоторые распространённые методы класса ServerSocket:
| Нет. | Описание метода |
| 1 |
public int getLocalPort() Возвращает порт, который прослушивает этот сокет. |
| 2 |
public Socket accept() throws IOException Прослушивает и принимает подключения к этому сокету. |
| 3 |
public void setSoTimeout(int timeout) Включает/отключает SO_TIMEOUT с указанным значением тайм-аута в миллисекундах. |
| 4 |
public void bind(SocketAddress host, int backlog) Привязывает ServerSocket к определённому адресу (IP-адресу и номеру порта). |
Методы класса Socket
Класс java.net.Socket представляет сокет, используемый как клиентом, так и сервером для обмена данными друг с другом. Клиент получает объект Socket, создавая его экземпляр, тогда как сервер получает объект Socket через возвращаемое значение метода accept().
Класс Socket имеет пять конструкторов.
| Нет. | Описание метода |
| 1 |
public Socket(String host, int port) throws UnknownHostException, IOException. Создает потоковый сокет и подключает его к указанному номеру порта на указанном хосте. |
| 2 |
public Socket(InetAddress host, int port) throws IOException Создает потоковый сокет и подключает его к указанному номеру порта по указанному IP-адресу. |
| 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. Создает сокет и подключает его к указанному удаленному порту по указанному удаленному адресу. |
| 5 |
public Socket() Создает несоединенный сокет, используя системный тип SocketImpl по умолчанию. |
Когда конструктор Socket возвращает управление, он не просто создаёт объект Socket; фактически он пытается подключиться к указанному серверу и порту.
Некоторые интересующие методы перечислены ниже. Обратите внимание, что и у клиента, и у сервера есть объект Socket, поэтому и клиент, и сервер могут вызывать эти методы.
| Нет. | Описание метода |
| 1 |
public void connect(SocketAddress host, int timeout) throws IOException Подключает этот сокет к серверу и задаёт значение тайм-аута. |
| 2 |
public InetAddress getInetAddress() Возвращает адрес, к которому подключён этот сокет. |
| 3 |
public int getPort() Возвращает удалённый порт, к которому подключён этот сокет. |
| 4 |
public int getLocalPort() Возвращает локальный порт, к которому привязан этот сокет. |
| 5 |
public SocketAddress getRemoteSocketAddress() Возвращает адрес конечной точки, к которой подключён этот сокет, или null, если он не подключён. |
| 6 |
public InputStream getInputStream() throws IOException Возвращает входной поток этого сокета. |
| 7 |
public OutputStream getOutputStream() throws IOException Возвращает выходной поток этого сокета. |
| 8 |
public void close() throws IOException Закрывает этот сокет. |
Методы класса InetAddress
Этот класс представляет адрес Интернет-протокола (IP). Ниже перечислены некоторые полезные методы для программирования сокетов:
| Нет. | Описание метода |
| 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 getLocalHost() Возвращает локальный хост. |
| 7 |
String toString() Преобразует этот IP-адрес в String. |
Пример клиента с сокетом
Следующий GreetingClient — это клиентская программа, которая подключается к серверу через сокет, отправляет запрос, а затем ожидает ответа.
Код файла GreetingClient.java:
Пример Socket-сервера
Следующая программа GreetingServer — это серверное приложение, которое использует Socket для прослушивания указанного порта.
Код файла GreetingServer.java:
Скомпилируйте приведённые выше два файла кода 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 Goodbye!Другие расширения