服务器之家:专注于服务器技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - 服务器知识 - ServerSocket默认邦定IP实现过程详解

ServerSocket默认邦定IP实现过程详解

2021-07-20 18:08cuisuqiang 服务器知识

这篇文章主要介绍了ServerSocket默认邦定IP实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 失败");
            }
            try {
                Socket socket = new Socket("192.168.1.100", 8888);
                System.out.println("192.168.1.100 成功" + socket.toString());
            } catch (Exception e) {
                System.err.println("192.168.1.100 失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此时的打印结果是:

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.iteye.com/blog/cuisuqiang-2037769

延伸 · 阅读

精彩推荐