前言:会去搜索这个问题并且有缘看到这篇文章的人,我相信你一定是个爱思考 爱钻牛角尖的人。每次遇到问题总想知道到底为什么,有时候会浪费很多时间也没有解决问题。如果这篇文章对你有用,麻烦点赞或评论下。

一 问题描述

在使用java代码ServerSocket serverSocket = new ServerSocket(8080);创建了服务器端的监听套接字后,我使用命令行工具cmd查看了当前的网络状态,如下图所示,套接字监听的IP地址是“0.0.0.0”,这和我预想的“127.0.0.1”不一样啊!

二 问题解决

使用可以指定IP地址的ServerSocket即可,代码如下图所示:

InetAddress addr = Inet4Address.getByAddress(new byte[]{127,0,0,1});
ServerSocket serverSocket = new ServerSocket(8080,50, addr);

使用命令行工具cmd查看当前的网络状态,如下图所示:

至此,问题已经解决。如果想了解上述代码的更详细的描述和为什么监听的地址是“0.0.0.0”,请继续往下看。

三 相关扩展知识

1 java SE 8 API

java.net Class ServerSocket

public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException

Parameters:
port - the port number, or 0 to use a port number that is automatically allocated.(端口号,如果设置0,系统将自动分配可用的端口号
backlog - requested maximum length of the queue of incoming connections.(TCP或UDP连接队列的最大长度,即服务器端同时最多可以打开的连接数量。这里我使用了50,因为查看Java源码,其设置的默认值就是50)
bindAddr - the local InetAddress the server will bind to(服务器将会绑定的本地IP地址

java.net Class Inet4Address 从java.net Class InetAddress继承的方法

public static InetAddress getByAddress(byte[] addr) throws UnknownHostException

Parameters:
addr - the raw IP address in network byte order

注意! 这里指定的IP地址为点分十进制形式的byte数组,byte类型的取值范围为-128到127,因此不能将IP地址设置为“192.168.0.1”,同时也不能设置IP地址为“126.0.0.1”,从计算机网络系统的角度分析,是可以理解的。上述IP为局域网IP或者公网IP,这些IP可以分配给计算机的网卡(全称网络接口卡,常见的以太网网卡或者WLAN无线网卡),在java程序中属于只读属性(查看本机IPInet4Address.getLocalHost();查看回环测试IP Inet4Address.getLoopbackAddress()),你唯一可操作的IP地址为 本地回环地址(Loopback Address),即形如 “127.X.X.X”的地址。 如果指定其他类型的IP地址,则会报错 “java.net.BindException: Cannot assign requested address: JVM_Bind”。

2 为什么监听 0.0.0.0

还是熟悉的配方,我们要从官方文档入手。

参考【rfc3330】,如果想了解更多相关知识可以查看【IPv4地址的分配原理】和【IP地址0.0.0.0表示什么】

0.0.0.0/8 - Addresses in this block refer to source hosts on “this” network. Address 0.0.0.0/32 may be used as a source address for this host on this network; other addresses within 0.0.0.0/8 may be used to refer to specified hosts on this network

0.0.0.0/8表示本网络中的所有主机。

通过子网掩码8,我们可以判断本网络是A类网络。换句话说,0.0.0.0/8表示A类网络中的所有主机。A类网络的前8位中,第一位0,表示是A类网络;剩下的7位,表示网络号。A类网络的后24位表示主机号(主机号不能为全0或全1,已被保留,有特殊含义。)

127开头的地址是A类地址的保留地址,用作本地软件环回测试(loopback test)本主机的进程之间的通信之用。因此,在本地计算机上监听的0.0.0.0表示的是A类网络中网络号为127的所有主机,其IP地址为127.0.0.1~127.255.255.254。

参考【特殊的IP地址127.x.x.x的含义】

A类地址(1.0.0.0~126.255.255.254)的网络号第一位都是0,127的第一位也是0。127开头的地址可以说是A类的保留地址,用作本地软件环回测试(loopback test)本主机的进程之间的通信之用。若主机发送一个目的地址为环回地址的IP数据报,则本机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络。本地主机与虚拟主机通信会使用虚拟网卡,其ip为127.0.0.1(win10系统此地址无法修改),主机名localhost。

其通信过程如下,如果监听的IP地址为0.0.0.0,感觉在IP为127.0.0.1~127.255.255.254主机上监听了某端口,例如“8080”,这样,在客户端访问任意一台主机的8080端口都可以响应,感觉上很多虚拟主机提供服务。我们一般在客户端浏览器中访问Tomcat服务器时,地址栏输入的URL通常为:localhost:8080,其等价于127.0.0.1:8080。其实,你输入 127.0.0.1到127.255.255.254的任意一个IP都可以访问的到,不信可以试试127.255.255.254:8080。

但是,如果监听一个特定的ip地址,如“127.0.0.1”,那么,URL中的主机只能使用localshot或者127.0.0.1,感觉上好像只有一台虚拟主机提供服务。在Socket编程中,客户端Socket,如果使用其他127开头的IP地址,会报错:java.net.ConnectException: Connection refused: connect


至此,总结下,监听0.0.0.0,客户端在访问时可以指定127.0.0.1~127.255.255.254之间的任意IP地址。
监听特定IP地址,客户端访问时只能使用该特定IP地址。


然后,查看Java SE 8 API关于ServerSocket类的描述,摘取关键部分:

Create a server with the specified port, listen backlog, and local IP address to bind to. The bindAddr argument can be used on a multi-homed host for a ServerSocket that will only accept connect requests to one of its addresses. If bindA ddr is null, it will default accepting connections on any/all local addresses.

创建一个指定了port,backlog,local IP address的Server。 bindAddr 参数可以用在多宿主主机上,ServerSocket将只能接收目的地址为bindAddr的连接请求。如果bindAddr为空,则默认接收任何/所有(目的地址为)本地地址的连接请求。

参考自网络:

A multi-homed host is one that has more than one network interface and therefore more than one IP address for which it can be addressed.
多宿主主机就是一台具有多个网络接口的主机,因此可以通过多个IP地址来访问这台主机。


当我们使用一个端口号的构造函数时,调用了重载的构造函数,此时bindAddr为空,则默认接收任何/所有(目的地址为)本地地址(127开头的地址)的连接请求。

Java如何给ServerSocket绑定指定IP地址相关推荐

  1. Java技巧: 根据网址查询DNS/IP地址

    需求: 给定一个URL地址, 例如: http://www.cncounter.com/tools/shorturl.php, 解析对应的IP地址和端口号. 说明: 本文不涉及底层的 DNS 协议, ...

  2. windows服务器指定IP地址才能进行远程访问桌面设置方法

    这篇文章主要介绍了windows服务器指定IP地址才能进行远程访问桌面设置方法,需要的朋友可以参考下 一般情况下分两种方法: 第一种是通过 防火墙来实现 等保测评要求:对服务器限制远程终端登录地址 于 ...

  3. linux双网卡绑定同一IP步骤,linux系统双网卡绑定单个IP地址

    双网卡绑定单个IP地址为了提供网络的高可用性,我们可能需要将多块网卡绑定成一块虚拟网卡对外提供服务,这样即使其中的一块物理网卡出现故障,也不会导致连接中断.多网卡绑. 为了提供网络的高可用性,我们可能 ...

  4. 3.指定IP地址抓包

    指定IP地址抓包时可以屏蔽哪些包? 答: 指定IP地址抓包的方式, 好处是可以屏蔽局域网内的ARP广播包, 减少不相关的杂讯抓包结果 如何指定IP地址? 答: 例如"ip.addr == 1 ...

  5. mysql 怎么设置ip地址_Mysql如何设置用户指定ip地址操作数据库

    Mysql设置用户指定ip地址操作数据库的方法: 语法: grant priv_type on mysql.user to 'user'@'host' identified by 'password' ...

  6. mysql 怎么设置ip地址_Mysql设置用户指定ip地址操作数据库的方法

    Mysql设置用户指定ip地址操作数据库的方法 发布时间:2020-09-29 15:00:47 来源:亿速云 阅读:65 作者:小新 这篇文章主要介绍Mysql设置用户指定ip地址操作数据库的方法, ...

  7. 瑞芯微RK3399Pro开发板 无线网卡绑定固定ip地址,并且使其开机自动连接对应WiFi

    wifi路由器一般都采用DHCP动态分配ip地址,因此通过nmcli命令直接连接wifi,板子的ip是不固定的,每次重启之后,再次连接wifi,会导致板子的ip地址发生变化,需要每次修改secureC ...

  8. linux配置指定ip访问指定端口号,操作系统linux和dos linux下通过iptables只允许指定ip地址访问指定端...

    一篇 : linux下通过iptables只允许指定ip地址访问指定端口的设置方法 首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的规则 iptables -X#清 ...

  9. 电脑IP受限制无法上网如何手动指定IP地址设置

    IP限制是什么意思?也就是说你的网络连接受到阻拦或者是你的IP地址无效不能用的意思.遇到ip地址受限制怎么解除呢?这个时候我们可以手动指定IP地址来解除故障,下面分享一下解决方法. 首先,我们必须找到 ...

  10. linux网卡永久生效命令,Linux/CentOS服务器 一个网卡绑定多IP地址(永久设置)

    Linux/CentOS服务器 一个网卡绑定多IP地址(永久设置) 有时我们在使用 Linux 服务器时需要配置多个IP地址.如果要配置多个IP地址是否需要多块网卡呢?答案是否定的.以 CentOS ...

最新文章

  1. 数据安全最佳实践案例库建设项目正式启动
  2. Unity3D教程:自定义mesh做指向信息面板效果
  3. 服务器dbback文件夹,怎么让SQL 2000定时复制备份数据库到局域网中的指定电脑上? - SQL Server论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  4. java 切面获取参数_每天分享一点Java知识(spring-aop)
  5. 976 AlvinZH想回家(背包DP大作战T)
  6. java mongo分组统计_探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics
  7. 功能Java示例 第3部分–不要使用异常来控制流程
  8. 干货|我在 GitHub 上发现了一款骚气满满的字体!
  9. DDFE 技术周刊(第四期)2016.11.25
  10. 苹果“修复”系统过于流畅的BUG遭到制裁,被罚款近2亿!网友:罚少了!
  11. Java测试代码及原理
  12. 怎么避免后台被搜索_【干货】一文读懂360搜索oCPC
  13. 下载堆糖图片-正则-xpath-BeautifulSoup-selenium-python爬虫
  14. Nginx配置443端口
  15. windows Internet Connection Sharing(ICS)服务的启动
  16. 什么是UserAgent
  17. adlds文件服务器,AD LDS管理工具入门攻略
  18. linux 大文件按照大小切割,关于linux系统下分割大文件的方法
  19. 前后分离,测试环境使用nginx调试解决跨域问题。
  20. PhotoEnhancer老照片修复,旧照修复,图像去噪,黑白照上色,AI图像修复,AI图像去噪,一键自动修复照片,附下载链接

热门文章

  1. java 拦截器实现接口调用频率限制
  2. 最好用的 7 款 Vue 3 富文本编辑器
  3. 安卓电视 TV端的webview网页 按键控制和一些小问题
  4. 免费正版 Win 10/8/7操作系统虚拟机镜像下载
  5. 软件项目管理案例教程课后答案
  6. 因特尔g41显卡 linux驱动,英特尔g41显卡驱动
  7. 数据结构教材答案(C语言版 严蔚敏)第一章 绪论
  8. HTML表单元素、表单控件
  9. 安装程序Repack攻略之MSI篇
  10. java安卓开发——1.新项目搭建