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 .