【问题标题】:webserver on an android hotspot - what's its IP?android 热点上的网络服务器 - 它的 IP 是什么?
【发布时间】:2017-12-01 15:35:20
【问题描述】:

我想将安卓手机设置为 wifi-hotspot,然后在其上运行网络服务器,并从连接到热点的另一部手机浏览它。

我的手机没有root,但我有termux,它有很多unix 实用程序。我不想安装额外的应用程序。 (但很高兴写一个!)

我可以在http://localhost(在主机上)上查看python 的简单网络服务器,但不能在另一部手机上查看。我尝试使用主机电话的面向公众的 IP(使用 whatsmyip 类型的网页检查它),但没有用。 有人说移动 ISP 会通过映射不同的内部和外部 IP 来防止这种情况发生……但在这里,它不是通过 ISP,而是通过热点……

我还尝试了来自 ifconfig 和 android 中的 wifi 控件的 IP 地址,确实适用于 netcat - 但只有连接到热点的客户端电话的 IP(不是主持人)。

netcat在手机上连接热点监听,然后netcat在热点手机上连接。 (即角色交换:热点客户端是 netcat 服务器)。奇怪的是,热点电话似乎没有 IP(至少,到目前为止,我还没有发现)。但它必须有一个,不是吗,netcat 连接...?

无论如何,我想要热点主机上的网络服务器,所以我需要它的 IP 来连接它……有没有办法得到它?

这一直困扰着我多年。 非常感谢您的帮助!

编辑this question 的答案说它(几乎)总是 192.168.43.1。我现在不能尝试;当我有时会更新。

更新
1.192.168.43.1作品
2. py http.server 适用于常规文件(例如 txt、pdf),但视频文件似乎需要一些它缺少的流协议。我发现lighttpd 有这个(在termux 中使用apt install lighttpd)。但它需要配置(并且没有例如/默认)。我用过:

$ cat > lighttp.conf
dir-listing.activate = "enable"
server.port = 8000
server.document-root = "MY PATH HERE"
$ lighttpd -D -f lighttpd.conf

目录列表使它更易于使用,但显然这里没有配置安全性,所以要小心你提供的内容。
3. Android(我的 5.1,无论如何)需要关闭飞行模式才能使其成为 wifi 热点 - 这对互联网访问很有意义......但是在这里,我只希望客户端可以访问主机,而不是访问它到整个互联网。所以我发现你可以关闭数据访问来防止这种情况,热点仍然有效。 (肯定有办法以编程方式在飞行模式下设置热点......)

你有它!手机作为媒体服务器。

【问题讨论】:

  • 是的,它主要是 192.168.43.1,您可以轻松地在设备本身上获取它。当它不是热点时,您也可以轻松获取设备本身的 ip。
  • @greenapps 怎么轻松搞定?
  • serversocket 有一个成员。此外,您可以通过 google 搜索这项明显的任务。
  • 后续问题..(对不起,我知道已经几个月了)我们知道192.168.43.1 是否会一直保持不变?这适用于所有Android手机吗? iOS 呢?
  • @luckyging3r 抱歉,我只知道它在我尝试过的两个机器人上都有效。你可以问一个新的具体问题。因为它是特定的,所以您可能会得到更好的答案。

标签: android ip webserver android-networking hotspot


【解决方案1】:
public static String getDeviceIpAddress( ) {
String deviceIpAddress = "###.###.###.###";

try {
    for (Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); enumeration.hasMoreElements();) {
        NetworkInterface networkInterface = enumeration.nextElement();

        for (Enumeration<InetAddress> enumerationIpAddr = networkInterface.getInetAddresses(); enumerationIpAddr.hasMoreElements();) {
            InetAddress inetAddress = enumerationIpAddr.nextElement();

           if (!inetAddress.isLoopbackAddress() && inetAddress.getAddress().length == 4) 
            {
                deviceIpAddress = inetAddress.getHostAddress();

                Log.e(TAG, "deviceIpAddress: " + deviceIpAddress);
            }
        }
    }
} catch (SocketException e) {
    Log.e(TAG, "SocketException:" + e.getMessage());
}

return deviceIpAddress;
}

我想这会对你有所帮助。

【讨论】:

  • 感谢您发布答案。我昨天尝试了这种方法(docs.oracle.com/javase/tutorial/networking/nifs/listing.html),但它没有给出热点 ip。 (我没有检查它,但我认为它给出的ip是面向公众的ip)。无论如何,我已经解决了我的问题,我只是再次调查它,因为@luckyging3r 询问了它。
  • 好吧,我昨天一定搞砸了我的测试(也许热点没有正确打开),但今天它给出了正确的 ip (192.168.43.1) 是其中列出的。并且您的 non-loopback 和 len==4 可以识别它。顺便说一句,当连接到 wifi(即不是热点)时,它会提供另一个与公共 ip 不同的 ip(您可以从 whatsmyip 网站上看到)。
  • 其他 ip(连接到 wifi 时)与 127.0.0.1 相同,即在设备上,我可以浏览设备上运行的网络服务器。我也可以从连接到同一个 wifi 的不同设备上浏览它。不幸的是,我目前只有wifi,所以无法进行公开测试。无论如何,这完全是一个不同的问题 - 感谢您的帮助!
  • if gives another ip which differs from the public ip (that you see from whatsmyip websites). 当然。它提供了设备从路由器获得的 ip。本地ip。局域网中的每个设备都有不同的 ip。但是对于最后一个数字块,它们看起来都一样。 Whatsmyip 提供路由器的公共 IP。您局域网中的每台设备都可以确定它。
  • Whatsmyip gives the public ip of the router. Every device in your lan candetermine it. 我们如何在代码中确定这一点? (另外,顺便说一句,你如何在 cmets 中格式化你的回复引号?nvm,我看到它是如何反引号代码格式化)
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多