Java — Сеть
Термин сетевое программирование относится к написанию программ, которые выполняются на нескольких устройствах (компьютерах), в которых все устройства подключены друг к другу с помощью сети.
Пакет java.net API-интерфейсов J2SE содержит набор классов и интерфейсов, предоставляющих детали низкоуровневого взаимодействия, что позволяет вам писать программы, ориентированные на решение поставленной задачи.
Пакет java.net обеспечивает поддержку двух распространенных сетевых протоколов —
-
TCP − TCP означает протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP/IP.
-
UDP − UDP расшифровывается как User Datagram Protocol, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.
Эта глава дает хорошее представление о следующих двух темах —
-
Программирование сокетов − Это наиболее широко используемая концепция в работе с сетями, и она была объяснена очень подробно.
-
Обработка URL − Это будет рассмотрено отдельно. Нажмите здесь, чтобы узнать об обработке URL-адресов на языке Java.
Программирование сокетов
Сокеты обеспечивают механизм связи между двумя компьютерами с использованием TCP. Клиентская программа создает сокет на своем конце соединения и пытается соединить этот сокет с сервером.
Когда соединение установлено, сервер создает объект сокета на своем конце соединения. Теперь клиент и сервер могут обмениваться данными, записывая и читая из сокета.
Класс java.net.Socket представляет собой сокет, а класс java.net.ServerSocket предоставляет серверной программе механизм прослушивания клиентов и установления с ними соединений.
Следующие шаги выполняются при установлении TCP-соединения между двумя компьютерами с использованием сокетов —
-
Сервер создает объект ServerSocket, указывающий, на каком номере порта должна происходить связь.
-
Сервер вызывает метод accept() класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу через заданный порт.
-
После ожидания сервера клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.
-
Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный обмениваться данными с сервером.
-
На стороне сервера метод accept() возвращает ссылку на новый сокет на сервере, который подключен к сокету клиента.
После того, как соединения установлены, обмен данными может осуществляться с использованием потоков ввода/вывода. Каждый сокет имеет как OutputStream, так и InputStream. Поток вывода клиента подключен к потоку ввода сервера, а поток ввода клиента подключен к потоку вывода сервера.
TCP — это протокол двусторонней связи, поэтому данные могут передаваться по обоим потокам одновременно. Ниже приведены полезные классы, предоставляющие полный набор методов для реализации сокетов.
Методы класса ServerSocket
java.net.ServerSocket class используется серверными приложениями для получения порта и прослушивания клиентских запросов.
Класс ServerSocket имеет четыре конструктора —
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>
Если конструктор ServerSocket не генерирует исключение, это означает, что ваше приложение успешно выполнило привязку к указанному порту и готово к клиентским запросам.
Ниже приведены некоторые из распространенных методов класса ServerSocket —
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>
Когда ServerSocket вызывает accept(), метод не возвращается до тех пор, пока не подключится клиент. После того, как клиент подключается, ServerSocket создает новый сокет на неуказанном порту и возвращает ссылку на этот новый сокет. Теперь между клиентом и сервером существует TCP-соединение, и можно начинать обмен данными.
Методы классов сокетов
java.net.Socket class представляет сокет, который клиент и сервер используют для связи друг с другом. Клиент получает объект Socket путем его создания, тогда как сервер получает объект Socket из возвращаемого значения метода accept().
Класс Socket имеет пять конструкторов, которые клиент использует для подключения к серверу —
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>
Когда конструктор Socket возвращается, он не просто создает экземпляр объекта Socket, но фактически пытается подключиться к указанному серверу и порту.
Здесь перечислены некоторые интересные методы класса Socket. Обратите внимание, что и клиент, и сервер имеют объект Socket, поэтому эти методы могут вызываться как клиентом, так и сервером.
Сер.№ | Метод и описание |
---|---|
1 | <тд>|
2 | <тд>|
3 | <тд>|
4 | <тд>|
5 | <тд>|
6 | <тд>|
7 | <тд>|
8 | <тд>
Методы класса InetAddress
Этот класс представляет адрес интернет-протокола (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