我可以使用Android模拟器访问我的笔记本电脑web服务器,我使用10.0.2.2:portno 工作得很好。

但当我连接真正的Android手机时,手机浏览器无法连接到我笔记本电脑上的同一个web服务器。手机和笔记本电脑通过USB线连接。如果我运行 adb devices命令,我可以看到我的手机。

我错过了什么?


当前回答

使用简单的解决方案(只需从移动设备访问laptop_ip_addr:port,当移动设备和笔记本电脑在同一个WiFi上时),我得到一个ERR_CONNECTION_REFUSED错误。也就是说,我的MacBook似乎拒绝了我手机的连接尝试。


ADB反向套接字(仅限Android)

这个解决方案适用于我(用MacBook进行测试):

用USB线连接Android移动设备到笔记本电脑 在移动设备上打开USB调试 在笔记本电脑上执行adb reverse tcp:4000 tcp:4000 使用您的自定义端口号,而不是4000 现在,在移动设备上,你可以导航到http://localhost:4000/,它实际上会连接到笔记本电脑,而不是移动设备

请看这里的说明。

缺点是这只能在一个移动设备上使用。如果你想用另一个移动设备访问,你必须先断开第一个设备(关闭USB调试),连接新的设备(打开USB调试),然后再次运行adb reverse tcp:4000 tcp:4000。

编辑:据报道此解决方案也适用于Windows。


Ngrok(适用于所有设备)

另一个应该总是有效的解决方案是ngrok(在其他答案中提到过)。它通过Internet工作,而不是本地网络。

它非常容易使用:

brew install ngrok
ngrok http 4000

在其他一些信息中,输出如下一行

Forwarding                    http://4cc5ac02.ngrok.io -> localhost:4000

现在,您可以在任何连接到Internet的设备上导航到http://4cc5ac02.ngrok.io,这个URL重定向到您笔记本电脑的localhost:4000。

请注意,只要ngrok命令正在运行(直到您按下Ctrl-C),您的项目就是公共服务的。所有拥有URL的人都可以看到它。

其他回答

我个人不坚持在使用设备时使用本地主机,没有简单的解决方案。

只需启动您连接到本地主机的活动,在那里您可以使用模拟器。无论你从设备得到什么信息都可以轻松生成,并可以作为参数发送给活动。

Mac OS X用户

我通过启用远程管理实现了这一点:

确保你的手机和笔记本电脑连接到同一个WiFi网络 在Mac上,进入系统首选项/共享 开启远程管理

你会看到一条类似这样的消息:

其他用户可以使用some.url.com地址管理您的计算机

在你的Android设备上,你现在应该能够访问some.url.com,它委托给Mac上的localhost。你也可以使用ifconfig来获得Mac的IP地址。


ngrok的可移植解决方案(任何带有Node.js的操作系统)

如果你不介意用临时域名公开你的项目,你可以使用ngrok。假设我有一个在localhost:9460上运行的应用程序,我可以简单地编写

npm install ngrok -g

ngrok http 9460

这将给我:

Session Status                online
Update                        update available (version 2.2.8, Ctrl-U to update)
Version                       2.2.3
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://f7c23d14.ngrok.io -> localhost:9460
Forwarding                    https://f7c23d14.ngrok.io -> localhost:9460

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

我现在可以通过https://f7c23d14.ngrok.io远程查看localhost。这是与客户分享设计工作或进展的好机会。


替代解决方案与nginx代理通过

如果你通过nginx proxy_pass运行类似这样的东西,它将需要更多的调整-这是一个hack方法,但它适用于我,我对改进它的建议是开放的:

启用远程管理(如上所述) 临时将服务器设置为监听81端口,而不是80端口 输入以下命令:

sudo nginx -s reload

访问http://youripaddress: 81

server {
  listen 80;
  listen 81;   # <-------- add this to expose the app on a unique port
  server_name  ~^(local|local\.m).example.com$;
  # ...
}

重新加载并访问http://youripaddress:81

在Ilya Saunkin回答的基础上,这里有一个命令,应该输出你的IP地址格式为超链接-只需用3000代替你的端口号:

ifconfig | grep "inet " | grep -v 127.0.0.1 | sed 's/netmask.*//g' | sed 's/inet//g' | awk '{print "http://"$1":3000/"}'

根据您运行命令的位置,您应该能够(在Mac上)按住命令键并单击/双击打开链接。

在你的ubuntu/Macbook中使用这个来获取你系统的ip地址。你的手机和系统应该在同一个网络中

ip addr | grep inet这将给你一个看起来像192.168.168.46的ip地址。在你的智能手机上使用这个。

希望这能有所帮助。

在Windows PC上,您可能不需要做任何其他事情,只需使用“ipconfig”命令查找您的IPv4地址。

第一步:用USB线连接你的手机和电脑。 第二步:使用命令'ipconfig'找到你的IPv4地址(路由器的外部IP),例如192.168.1.5。 步骤3:只需从手机浏览器中访问“192.168.1.5:8080”。真的有用!

其他环境细节: Windows 7,谷歌Nexus 4 (4.2.2), Tomcat服务器,Grails应用程序。

你还应该确保你在AndroidManifest文件中有访问internet的权限:

<uses-permission android:name="android.permission.INTERNET"/>