• Windows 与 Linux下关于端口不能访问的问题


    自己写的一个HTTP文件服务器,在端口 50000上监听HTTP连接请求,在Eclipse里面将程序正常地启动之后,能够在自己的机器上(Eclipse启动该程序的机器上)访问 50000端口,即FileServer能够正常提供服务,可是在同一局域网下的其他机子则访问不了。(FileServer运行的机器称为本机,同一局域网内的机器称为 其他机子)

    本机状态如下:

    系统:Windows 7

    防火墙状态:已关闭

    同一局域网的其他机子能够 ping 通 本机。但是使用 telnet ip 50000 提示连接拒绝。

    后面看到这篇文章:开放windows服务器端口-----以打开端口8080为例

    按照操作把50000端口,添加防火墙例外设置之后,未果。因为我的防火墙本来就是关闭的啊,应该不是添加例外端口的原因吧。。。。。

    于是,又把防火墙开启,结果其他机子都ping不通本机了,更别说访问 50000端口的服务了。

    后来,把程序Eclipse导出jar包放到Linux上运行,也是同样的结果---其他机子能ping通,但就是访问不了FileServer的50000端口。

    但该端口是正常运行的:

    系统为CentOS,防火墙也已关闭。

    使用telent ip 50000端口,提示:Connection Refused

    原来问题的原因是:直接看代码,

    ChannelFuture f = b.bind("localhost", port).sync();
    System.out.println("HTTP 文件服务器启动, 地址是: " + "localhost:" + port + url);

    代码中使用了 localhost

    把 localhost修改成本机的IP地址,问题解决。

    ChannelFuture f = b.bind("10.0.12.160", port).sync();
    System.out.println("HTTP 文件服务器启动, 地址是: " + "http://10.0.12.160:" + port + url);

    重新编译,运行程序。不管在Windows下,还是在Linux下,都能访问50000端口了。

    其中,CentOS状态是:防火墙关闭了的。

    其中,Windows状态是:防火墙关闭了的。

    原因总结:

    这其实不是防火墙的问题,因为防火墙已经关闭了。而是一个简单的网络地址问题:

    localhost 本质上是个域名,理论上可以指向任何IP地址,只不过一般都是指的是环回地址:127.0.0.1,对于环回地址而言,其他计算机是不能访问的!!!

    假设程序中使用 localhost 作为bind()方法的绑定的参数,可以看到其端口启动信息如下:

    也就是说,这个50000端口绑定在了环回地址上!!!

    这也是为什么 telnet 192.168.121.35 50000 提示Connection Refused的原因,因为50000端口在 127.0.0.1上。

    把程序中使用IP地址(192.168.121.35)作为bind方法的绑定参数,启动程序后,看到端口信息如下:

    端口50000绑定的不再是环回地址了,而是一个IP地址。

    那为什么能够ping通 192.168.121.35 呢?当然能了,在同一个局域网里面,防火墙也是关闭的,网络是正常的。

    现在终于知道原来就算能ping通,ping命令说明到192.168.121.35地址没有问题。但是我们的程序的端口是在 127.0.0.1这个地址上,这也是为什么尽管防火墙关闭了,其他机子还是访问不了50000端口的原因。----环回地址只能在本机上使用。

    写程序时要细心,测试的时候用localhost,上线了就不要用了。

    ------------------------------------分割线-------------------------------

    明白了 localhsot对应的就是 127.0.0.1之后,其实在代码里面的 bind()方法也可以使用 "localhsot" 作为参数,并让其他机子能够访问文件服务器(端口50000),只需要把 localhost 对应的地址127.0.0.1改成主机的IP地址就可以了。

    比如, /etc/hosts文件的默认内容如下:

    可以看到, localhost对应的就是 127.0.0.1

    如果把它改成 192.168.121.35

    那么,在程序中使用 "localhost"参数,其他机子也能访问文件服务器的50000端口了。

    也就是说:

    127.0.0.1 是绑定在 loopback 接口上的地址,如果服务端套接字绑定在它上面,你的客户端程序就只能在本机访问。多简单的原理!!细心就可以了!

    参考:localhost、127.0.0.1 和 本机IP 三者的区别?

  • 相关阅读:
    Windows Azure 上的 Symfony,适用于 PHP 开发者的强大组合
    VM Depot 镜像新增系列II – 学习管理系统,内容管理系统以及平台管理工具
    VM Depot 镜像新增系列III – 社交媒体,内容管理 与 项目协同系统
    教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像
    使用 Chef 管理 Azure 资源
    微软开放技术发布开源的微软云服务器底盘管理器 (Chasis Manager) 软件
    使用 Gradle 实现 TFS 构建自动化
    携手 Google 和 Docker 为 Microsoft Azure 带来全新的开源容器技术
    VM Depot 中国上的 Bitnami 镜像更新至 Ubuntu 14.04 LTS
    Windows Azure云服务价格调整通知
  • 原文地址:https://www.cnblogs.com/hapjin/p/5367429.html
Copyright © 2020-2023  润新知