Как определить входящее соединение с локальной машины

У меня есть SocketServer, принимающий входящие соединения. По соображениям безопасности я должен разрешать только локальные подключения (подключения с компьютера, на котором работает сервер).

Как определить, поступает ли входящее соединение с другого компьютера? Является ли следующий код безопасным для этого?

Socket socket = someServerSocket.accept(); String remoteAddress = socket .getInetAddress().getHostAddress(); if (!fromThisMachine(remoteAddress)) { // Not from this machine. } 

в то время как fromThisMachine() выглядит так:

 public boolean fromThisMachine(String remoteAddress) { try { Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface networkInterface = interfaces.nextElement(); Enumeration addresses = networkInterface.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress inetAddress = addresses.nextElement(); String hostName = inetAddress.getHostName(); String hostAddr = inetAddress.getHostAddress(); if (hostName.equals(remoteAddress) || hostAddr.equals(remoteAddress)) { return true; } } } } catch (Exception e) { e.printStackTrace(); return false; } log("Unauthorized request to server from: " + remoteAddress); return false; } 

Спасибо, Мохсен

Если вы хотите ограничить соединения с локальным хостом, укажите это при открытии ServerSocket. Если вы только слушаете локальный хост, вы получите только соединения с localhost.

  int port = ..... SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(socketAddress); serverSocket.accept(); 

InetAddress.getByName (null) всегда возвращает loopback-адрес. См. Javadoc

  int port = ..... SocketAddress socketAddress = new InetSocketAddress( InetAddress.getByName( null ), port); ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(socketAddress); serverSocket.accept(); 

Спасибо, скаффман. Следующий код работал с небольшой манипуляцией (жесткое кодирование 127.0.0.1).

 int port = ..... SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(socketAddress); serverSocket.accept(); 

Если я читаю локальный адрес из InetAddress.getLocalHost (), другие пользователи сети в одной подсети все еще могут видеть мой сервер.

Мохсен.