English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Программирование сети — это создание программ, которые работают на нескольких устройствах (компьютерах), которые связаны между собой через сеть.
В пакете 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.
Сокет использует TCP для обеспечения механизма связи между двумя компьютерами. Клиентское приложение создает сокет и пытается подключиться к сокету сервера.
Когда устанавливается соединение, сервер создает объект Socket. Клиент и сервер теперь могут обмениваться данными, пишя и читая из объекта Socket.
Класс java.net.Socket представляет собой сокет, а класс java.net.ServerSocket предоставляет серверному приложению механизм для прослушивания клиентов и установления с ними соединения.
Следующие шаги会出现, когда устанавливается TCP-соединение между двумя компьютерами с использованием сокета:
Создайте объект ServerSocket, представляющий собой сокет для общения через порт на сервере.
Сервер вызывает метод accept() класса ServerSocket, который будет ждать, пока клиент не подключится к серверу на указанном порту.
Когда сервер ожидает подключения, клиент создает объект Socket, указывая имя сервера и порт для запроса подключения.
Конструктор класса Socket пытается подключить клиента к указанному серверу и порту. Если соединение установлено, на клиенте создается объект Socket, который может общаться с сервером.
На сервере метод accept() возвращает новый сокет, который подключен к сокету клиента на сервере.
После установления соединения используйте потоки ввода/вывода для общения. У каждого сокета есть поток ввода и поток вывода. Поток вывода клиента подключен к потоку ввода сервера, а поток ввода клиента подключен к потоку вывода сервера.
TCP - двунаправленный протокол通信, поэтому данные могут быть отправлены через два данных потока в одно и то же время. Вот набор полезных методов, предоставляемых этим классом, для реализации сокета.
Серверное приложение использует класс java.net.ServerSocket для получения порта и侦听 клиентских запросов.
Класс ServerSocket имеет четыре конструктора:
Номер | Описание метода |
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 Создайте сервер, используя указанный порт,侦听 backlog и локальный 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-адрес и порт). |
Класс 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 |
Когда метод constructors Socket возвращает, и он фактически пытается подключиться к указанному серверу и порту.
Ниже перечислены некоторые интересующие методы, обратите внимание, что у клиента и сервера есть объект Socket, поэтому как клиент, так и сервер могут вызывать эти методы.
Номер | Описание метода |
1 | public void connect(SocketAddress host, int timeout) throws IOException Подключает этот套кет к серверу и specifies a timeout value. |
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 Закрытие этого套кета. |
Этот класс представляет собой адрес интернет-протокола (IP). Ниже перечислены методы, которые могут быть полезны при программировании с использованием Socket:
Номер | Описание метода |
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-адрес в строку. |
Ниже приведен пример клиента 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(); } } }
Ниже приведен пример программы 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 Прощай!