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端口。

當然,這也不是雙網卡的驗證,因為還是在一個網卡上玩。有條件的可以到刀片機上小測一把。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM