Java - Сеть
Термин « сетевое программирование» относится к написанию программ, которые выполняются на нескольких устройствах (компьютерах), в которых все устройства подключены друг к другу через сеть.
Пакет java.net API-интерфейсов J2SE содержит набор классов и интерфейсов, которые предоставляют детали низкоуровневого взаимодействия, позволяя вам писать программы, которые сосредоточены на решении возникшей проблемы.
Пакет java.net обеспечивает поддержку двух распространенных сетевых протоколов -
TCP- TCP означает протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.
UDP - UDP - это протокол дейтаграмм пользователя, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.
Эта глава дает хорошее понимание следующих двух тем:
Socket Programming - Это наиболее широко используемое понятие в сети, и оно было объяснено очень подробно.
URL Processing- Об этом будет рассказано отдельно. Щелкните здесь, чтобы узнать об обработке URL-адресов на языке Java.
Программирование сокетов
Сокеты обеспечивают механизм связи между двумя компьютерами с использованием TCP. Клиентская программа создает сокет на своем конце связи и пытается подключить этот сокет к серверу.
Когда соединение установлено, сервер создает объект сокета на своем конце связи. Теперь клиент и сервер могут обмениваться данными посредством записи в сокет и чтения из него.
Класс java.net.Socket представляет сокет, а класс java.net.ServerSocket предоставляет механизм для серверной программы, чтобы слушать клиентов и устанавливать с ними соединения.
Следующие шаги происходят при установлении TCP-соединения между двумя компьютерами с использованием сокетов:
Сервер создает экземпляр объекта ServerSocket, обозначающего, по какому номеру порта должна происходить связь.
Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу на заданном порту.
После ожидания сервером клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.
Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный взаимодействовать с сервером.
На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к сокету клиента.
После того, как соединения установлены, связь может происходить с использованием потоков ввода-вывода. Каждый сокет имеет как OutputStream, так и InputStream. Клиентский поток OutputStream подключен к InputStream сервера, а клиентский InputStream подключен к OutputStream сервера.
TCP - это протокол двусторонней связи, поэтому данные могут отправляться через оба потока одновременно. Ниже приведены полезные классы, предоставляющие полный набор методов для реализации сокетов.
Методы класса ServerSocket
В java.net.ServerSocket Класс используется серверными приложениями для получения порта и прослушивания клиентских запросов.
Класс ServerSocket имеет четыре конструктора -
Sr. No. | Метод и описание |
---|---|
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 Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, позволяя серверу указывать, на каком из своих IP-адресов принимать запросы клиентов. |
4 | public ServerSocket() throws IOException Создает несвязанный серверный сокет. При использовании этого конструктора используйте метод bind (), когда будете готовы привязать сокет сервера. |
Если конструктор ServerSocket не генерирует исключение, это означает, что ваше приложение успешно привязано к указанному порту и готово для клиентских запросов.
Ниже приведены некоторые из общих методов класса ServerSocket.
Sr. No. | Метод и описание |
---|---|
1 | public int getLocalPort() Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт за вас. |
2 | public Socket accept() throws IOException Ожидает входящего клиента. Этот метод блокируется до тех пор, пока либо клиент не подключится к серверу через указанный порт, либо время ожидания сокета не истечет, предполагая, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок. |
3 | public void setSoTimeout(int timeout) Устанавливает значение тайм-аута, определяющее, как долго серверный сокет ожидает клиента во время accept (). |
4 | public void bind(SocketAddress host, int backlog) Привязывает сокет к указанному серверу и порту в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов. |
Когда ServerSocket вызывает accept (), метод не возвращается, пока клиент не подключится. После подключения клиента ServerSocket создает новый Socket на неуказанном порту и возвращает ссылку на этот новый Socket. Теперь между клиентом и сервером существует TCP-соединение, и связь может начаться.
Методы класса сокета
В java.net.SocketКласс представляет сокет, который и клиент, и сервер используют для связи друг с другом. Клиент получает объект Socket, создав его экземпляр, тогда как сервер получает объект Socket из возвращаемого значения метода accept ().
Класс Socket имеет пять конструкторов, которые клиент использует для подключения к серверу:
Sr. No. | Метод и описание |
---|---|
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не генерирует исключение, соединение установлено успешно и клиент подключен к серверу. |
2 | public Socket(InetAddress host, int port) throws IOException Этот метод идентичен предыдущему конструктору, за исключением того, что узел обозначается объектом InetAddress. |
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. Этот метод идентичен предыдущему конструктору, за исключением того, что узел обозначается объектом InetAddress вместо String. |
5 | public Socket() Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу. |
Когда конструктор Socket возвращается, он не просто создает экземпляр объекта Socket, но фактически пытается подключиться к указанному серверу и порту.
Некоторые методы, представляющие интерес в классе Socket, перечислены здесь. Обратите внимание, что и клиент, и сервер имеют объект Socket, поэтому эти методы могут быть вызваны как клиентом, так и сервером.
Sr. No. | Метод и описание |
---|---|
1 | public void connect(SocketAddress host, int timeout) throws IOException Этот метод подключает сокет к указанному хосту. Этот метод необходим только тогда, когда вы создаете экземпляр Socket с помощью конструктора без аргументов. |
2 | public InetAddress getInetAddress() Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет. |
3 | public int getPort() Возвращает порт, к которому привязан сокет на удаленной машине. |
4 | public int getLocalPort() Возвращает порт, к которому привязан сокет на локальном компьютере. |
5 | public SocketAddress getRemoteSocketAddress() Возвращает адрес удаленного сокета. |
6 | public InputStream getInputStream() throws IOException Возвращает входной поток сокета. Входной поток подключается к выходному потоку удаленного сокета. |
7 | public OutputStream getOutputStream() throws IOException Возвращает выходной поток сокета. Выходной поток подключается к входному потоку удаленного сокета. |
8 | public void close() throws IOException Закрывает сокет, из-за чего этот объект Socket больше не может повторно подключаться к какому-либо серверу. |
Методы класса InetAddress
Этот класс представляет адрес Интернет-протокола (IP). Вот следующие полезные методы, которые вам понадобятся при программировании сокетов:
Sr. No. | Метод и описание |
---|---|
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 InetAddress getLocalHost() Возвращает локальный хост. |
7 | String toString() Преобразует этот IP-адрес в строку. |
Пример Socket Client
Следующий 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!