Перейти к основному содержимому

Найдите IP-адрес клиента, подключенного к серверу

· 4 мин. чтения

1. Введение

В этом кратком руководстве мы узнаем, как найти IP-адрес клиентского компьютера, подключенного к серверу.

Мы создадим простой клиент-серверный сценарий, который позволит нам исследовать API-интерфейсы java.net , доступные для связи TCP/IP.

2. Фон

Приложения Java используют сокеты для связи и отправки данных через Интернет . Java предоставляет класс java.net.Socket для клиентских приложений.

Класс java.net.ServerSocket используется для реализации сокетов на стороне сервера на основе TCP /IP. Однако давайте сосредоточимся только на приложениях TCP/IP.

3. Пример использования

Предположим, что у нас есть сервер приложений, работающий в нашей системе. Этот сервер отправляет приветственные сообщения клиентам. В этом случае сервер использует для связи TCP-сокет.

Сервер приложений привязан к определенному порту TCP. Его адрес сокета представляет собой комбинацию этого порта и IP-адреса интерфейса локальной сети . По этой причине клиент должен использовать этот конкретный адрес сокета для подключения к серверу.

4. Образец заявления

Теперь, когда мы определили наш вариант использования, давайте начнем с создания сервера.

4.1. Сервер приложений

Во-первых, нам нужно создать экземпляр ServerSocket для прослушивания входящих запросов на подключение. Конструктор класса ServerSocket требует номер порта в качестве аргумента:

public class ApplicationServer {

private ServerSocket serverSocket;
private Socket connectedSocket;

public void startServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
connectedSocket = serverSocket.accept();
//...

4.2. Получение IP-адреса клиента

Теперь, когда мы установили наш сокет для входящего клиента, давайте посмотрим, как получить IP-адрес клиента. Экземпляр Socket содержит адрес сокета удаленного клиента. Мы можем использовать метод getRemoteSocketAddress , чтобы проверить это.

Метод getRemoteSocketAddress возвращает объект типа SocketAddress . Это абстрактный класс Java. В данном случае мы знаем, что это соединение TCP/IP, поэтому мы можем привести его к InetSocketAddress :

InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress();

Как мы уже видели, адрес сокета представляет собой комбинацию IP-адреса и номера порта. Мы можем использовать getAddress для получения IP-адреса . Это возвращает объект InetAddress . Однако мы также можем использовать getHostAddress для получения строкового представления IP-адреса :

String clientIpAddress = socketAddress.getAddress()
.getHostAddress();

4.3. Отправка приветственного сообщения клиенту

Теперь сервер и клиент могут обмениваться приветственными сообщениями:

String msg = in.readLine();
System.out.println("Message received from the client :: " + msg);
PrintWriter out = new PrintWriter(connectedSocket.getOutputStream(), true);
out.println("Hello Client !!");

5. Протестируйте приложение

Давайте теперь создадим клиентское приложение для тестирования нашего кода. Этот клиент будет работать на отдельном компьютере и подключаться к нашему серверу.

5.1. Создайте клиентское приложение

Во- первых, нам нужно установить соединение Socket со службой, используя IP-адрес и номер порта:

public class ApplicationClient {
public void connect(String ip, int port) throws IOException {
clientSocket = new Socket(ip, port);
}
}

Подобно серверному приложению, мы будем использовать BufferedReader и PrintWriter для чтения и записи в сокет. Для отправки сообщений на сервер создадим метод для записи в подключенный сокет:

public void sendGreetings(String msg) throws IOException {
out.println(msg);
String reply = in.readLine();
System.out.println("Reply received from the server :: " + reply);
}

5.2. Запустите приложение

Далее запустим клиентское приложение, выбрав для него свободный порт .

После этого нам нужно запустить клиентское приложение с другого ПК. Для этого примера предположим, что IP-адрес сервера — 192.168.0.100 , а порт 5000 свободен:

java -cp com.foreach.clientaddress.ApplicationClient 192.168.0.100 5000 Hello

Здесь мы предполагаем, что клиент и сервер находятся в одной сети. После того, как клиент установит успешное соединение с сервером, IP-адрес клиента будет напечатан на консоли сервера.

Если IP-адрес клиента, например, 192.168.0.102, мы должны увидеть его в консоли:

IP address of the connected client :: 192.168.0.102

5.3. Что произошло на заднем плане?

Как правило, когда сервер приложений запускается, ServerSocket создает экземпляр объекта сокета, используя заданный номер порта и IP-адрес с подстановочным знаком. После этого он меняет свой статус на «Прослушивание» для входящих запросов на подключение . Затем, когда клиент отправляет запрос на подключение, ServerSocket создает экземпляр нового сокета, вызывая метод accept .

Вновь созданный экземпляр сокета содержит IP-адрес и порт сервера, а также удаленного клиента. В качестве IP-адреса сервера класс ServerSocket использует IP-адрес локального сетевого интерфейса, через который он получил входящий запрос. Затем, чтобы получить IP-адрес удаленного клиента, он декодирует IP-заголовок полученного TCP-пакета и использует исходный адрес.

6. Заключение

В этой статье мы определили пример использования клиент-сервер и использовали программирование сокетов Java, чтобы найти IP-адрес клиента, подключенного к серверу.

Как всегда, код этого приложения доступен на GitHub .