如何创建仅限localhost的Java套接字?

Mat*_*nge 31 java sockets networking

我有一个Java服务器,使用ServerSocket打开一个套接字(使用Thrift).该服务器在Obj-c中的本地机器上有一个客户端,它与Java服务器通信.一切都发生在localhost上.现在java服务器在网络上也是可见的,我希望java服务器只能在localhost上访问.否则,这是一个潜在的安全漏洞,当防火墙警告他们时,它会吓跑用户.

我尝试使用InetSocketAddress('localhost',9090)创建服务器套接字,但似乎没有任何效果.我怎样才能将这个东西限制在localhost?

Mat*_*ías 40

取自另一个问题:

new ServerSocket(9090, 0, InetAddress.getByName(null));
Run Code Online (Sandbox Code Playgroud)

InetAddress.getByName(null) 指向环回地址(127.0.0.1)

这里的地方说的Javadoc

  • 尝试在android上,getByName(null)不起作用(无论如何都无法连接到以这种方式打开的套接字).getByname("127.0.0.1")确实有效,即时工作,恕我直言,更具可读性和"便携性" (5认同)
  • 刚发现这个.有趣.现在有方法`InetAddress.getLoopbackAddress()` (2认同)

Geo*_*edy 21

尝试

new ServerSocket(9090, 0, InetAddress.getByName("localhost"))
Run Code Online (Sandbox Code Playgroud)

构造函数的最后一个参数指定将侦听套接字绑定到的地址.

  • 为什么不使用InetAddress.getLocalHost()?http://docs.oracle.com/javase/1.4.2/docs/api/java/net/InetAddress.html#getLocalHost() (7认同)
  • +1 - 但请记住,有些机器不理解"localhost".因此,使用IP地址127.0.0.1可能更强大. (6认同)
  • @Stephen可能会导致将来主要是IPv6甚至IPv6的主机出现问题. (3认同)
  • @shinkou当然*应该是*,尽管主要操作系统的分布并非如此.我会低估那些经销商而不是这个答案. (2认同)

Fab*_*nge 21

让我来看一个只接受环回设备的替代解决方案.所有其他"localhost"解决方案将使Java选择一个接口.

new ServerSocket(9090, 0, InetAddress.getLoopbackAddress());
Run Code Online (Sandbox Code Playgroud)

这是从Java 7开始提供的,甚至没有抛出 UnknownHostException