天天看點

ServerSocket 預設邦定IP

開發中需要開啟服務端的時候,本地測試都是直接寫端口,實際環境也是需要指定要邦定的IP才可以。

因為對于伺服器來說,有時它不止一塊網卡,而我們系統一定是通過指定的IP和端口進行通信的,是以服務端所使用的IP和端口都需要定義配置檔案。

那麼在平常測試時,在沒有指定IP的情況下,ServerSocket到底邦定到哪裡了?

在這種情況下,伺服器會把此端口綁定到0.0.0.0上面,即在所有IP上面都綁定,即能在每個ip上面收到請求。至于0.0.0.0是什麼,這裡就不說了。

下面是一個測試程式,通過如下程式即可看到到底是怎麼樣的情況:

Java代碼  

ServerSocket 預設邦定IP

package test;  

import java.net.InetSocketAddress;  

import java.net.ServerSocket;  

import java.net.Socket;  

public class Test {  

    public static void main(String[] args) throws Exception {  

        SocketClient client = new SocketClient();  

        new Thread(client).start();  

        ServerSocket serverSocket = new ServerSocket();  

        serverSocket.bind(new InetSocketAddress(8888));  

//      serverSocket.bind(new InetSocketAddress("127.0.0.1",8888));  

//      serverSocket.bind(new InetSocketAddress("192.168.1.100",8888));  

        System.out.println(serverSocket.toString());  

        serverSocket.accept();  

    }  

}  

class SocketClient implements Runnable{  

    public void run() {  

        try {  

            Thread.sleep(2000);  

            try {  

                Socket socket = new Socket("127.0.0.1", 8888);  

                System.out.println("127.0.0.1 成功" + socket.toString());  

            } catch (Exception e) {  

                System.err.println("127.0.0.1 失敗");  

            }  

                Socket socket = new Socket("192.168.1.100", 8888);  

                System.out.println("192.168.1.100 成功" + socket.toString());  

                System.err.println("192.168.1.100 失敗");  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

此時的列印結果是:

ServerSocket 預設邦定IP

ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8888]  

127.0.0.1 成功Socket[addr=/127.0.0.1,port=8888,localport=59213]  

192.168.1.100 成功Socket[addr=/192.168.1.100,port=8888,localport=59214]  

使用127.0.0.1時列印結果:

ServerSocket 預設邦定IP

ServerSocket[addr=/127.0.0.1,port=0,localport=8888]  

127.0.0.1 成功Socket[addr=/127.0.0.1,port=8888,localport=59416]  

192.168.1.100 失敗  

 使用192.168.1.100時列印結果:

ServerSocket 預設邦定IP

ServerSocket[addr=/192.168.1.100,port=0,localport=8888]  

127.0.0.1 失敗  

192.168.1.100 成功Socket[addr=/192.168.1.100,port=8888,localport=59429]  

可以看到預設邦定到的是0.0.0.0,此時使用任何能标記到本台電腦的IP都可以通路到8888端口。

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