ServerSocket 默认邦定IP

转自:http://cuisuqiang.iteye.com/blog/2037769

开发中需要开启服务端的时候,本地测试都是直接写端口,实际环境也是需要指定要邦定的IP才可以。

因为对于服务器来说,有时它不止一块网卡,而我们系统一定是通过指定的IP和端口进行通信的,所以服务端所使用的IP和端口都需要定义配置文件。

那么在平常测试时,在没有指定IP的情况下,ServerSocket到底邦定到哪里了?

在这种情况下,服务器会把此端口绑定到0.0.0.0上面,即在所有IP上面都绑定,即能在每个ip上面收到请求。至于0.0.0.0是什么,这里就不说了。

下面是一个测试程序,通过如下程序即可看到到底是怎么样的情况:

Java代码  收藏代码
  1. package test;  
  2. import java.net.InetSocketAddress;  
  3. import java.net.ServerSocket;  
  4. import java.net.Socket;  
  5. public class Test {  
  6.     public static void main(String[] args) throws Exception {  
  7.         SocketClient client = new SocketClient();  
  8.         new Thread(client).start();  
  9.           
  10.         ServerSocket serverSocket = new ServerSocket();  
  11.         serverSocket.bind(new InetSocketAddress(8888));  
  12. //      serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));  
  13. //      serverSocket.bind(new InetSocketAddress("192.168.1.100",8888));  
  14.         System.out.println(serverSocket.toString());  
  15.         serverSocket.accept();  
  16.     }  
  17. }  
  18. class SocketClient implements Runnable{  
  19.     public void run() {  
  20.         try {  
  21.             Thread.sleep(2000);  
  22.             try {  
  23.                 Socket socket = new Socket("127.0.0.1", 8888);  
  24.                 System.out.println("127.0.0.1 成功" + socket.toString());  
  25.             } catch (Exception e) {  
  26.                 System.err.println("127.0.0.1 失败");  
  27.             }  
  28.             try {  
  29.                 Socket socket = new Socket("192.168.1.100", 8888);  
  30.                 System.out.println("192.168.1.100 成功" + socket.toString());  
  31.             } catch (Exception e) {  
  32.                 System.err.println("192.168.1.100 失败");  
  33.             }  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  

此时的打印结果是:

Java代码  收藏代码
  1. ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8888]  
  2. 127.0.0.1 成功Socket[addr=/127.0.0.1,port=8888,localport=59213]  
  3. 192.168.1.100 成功Socket[addr=/192.168.1.100,port=8888,localport=59214]  

使用127.0.0.1时打印结果:

Java代码  收藏代码
  1. ServerSocket[addr=/127.0.0.1,port=0,localport=8888]  
  2. 127.0.0.1 成功Socket[addr=/127.0.0.1,port=8888,localport=59416]  
  3. 192.168.1.100 失败  

 使用192.168.1.100时打印结果:

Java代码  收藏代码
  1. ServerSocket[addr=/192.168.1.100,port=0,localport=8888]  
  2. 127.0.0.1 失败  
  3. 192.168.1.100 成功Socket[addr=/192.168.1.100,port=8888,localport=59429]  

可以看到默认邦定到的是0.0.0.0,此时使用任何能标记到本台电脑的IP都可以访问到8888端口。

当然,这也不是双网卡的验证,因为还是在一个网卡上玩。有条件的可以到刀片机上小测一把。  

原文地址:https://www.cnblogs.com/x_wukong/p/5159737.html