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

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

我错过了什么?


当前回答

Ngrok是最好的解决方案。 如果你正在开发PHP,那么我建议安装Laravel Valet,它有MacOS和Linux版本,然后你可以使用Valet共享命令。如果你正在开发任何前端技术,需要共享一个端口,比如3000,那么直接使用ngrok


Xampp和ngrok

你也可以在Windows中使用ngrok和Xampp。您可以使用以下流程。这很简单。

在ngrok上注册一个免费账户 从下载部分下载ngrok文件并打开它

注意Apache服务器运行的端口。我的情况是80

在ngrok命令行中输入ngrok http YOUR_PORT并复制转发地址

现在你可以在任何设备上使用这个转发链接(即你的物理android设备),它将托管你的本地主机服务器。例如,

取代

http://localhost/my-files/

with

http://YOUR_FORWARDING_ADDRESS/my-files/

其他回答

Ngrok允许你把本地主机放到临时服务器上,设置非常简单。我在这里提供了一些可以在链接中找到的步骤:

从上面的链接下载ngrok压缩包 拉开拉链 在本地运行服务器并记录端口号 在终端中,进入ngrok所在的文件夹,输入ngrok http[端口号]

您将在终端中看到一个小仪表板,其中有一个指向本地主机的地址。将你的应用指向这个地址,然后构建到你的设备上。

在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"/>

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

Windows解决方案:

你无法浏览你的网站,主要是因为你的防火墙( 默认操作系统防火墙或防病毒防火墙)正在阻止传入 连接。

Windows防火墙下:

要允许特定端口上的传入连接,请转到:

控制面板> Windows防御防火墙>高级设置>右侧 单击“入站规则>添加新规则”。 然后: 选择“端口”单选按钮。 输入要在其上启用传入连接的特定端口/范围(服务器正在运行的端口) 选择“允许连接”单选按钮。 单击Next(除非您想更改默认值) 给规则起个名字,然后单击Finish。

注意:

如果您正在使用带有防火墙的防病毒软件,那么上述步骤将不起作用,因为防病毒软件将禁用Windows防火墙,而是运行自己的防火墙。

在这种情况下,根据防病毒程序,转到您的防病毒防火墙设置并打开端口。

首先,让你的机器(服务器运行的地方)IP地址是静态的。在android代码中输入此静态IP地址。 接下来进入你的wifi路由器接口,检查左边的面板。您将看到端口转发/转发等选项。点击它并转发端口80。 现在编辑httpd .conf文件,并将其编辑为

所有人允许

. 重新启动服务器。现在一切都可以正常工作了。

此外,您可以保留您的机器的IP地址,以便始终分配给您。 在路由器接口的左面板中,找到DHCP -> Address Reservation,单击它。输入计算机的MAC地址和您在代码中输入的IP地址。单击保存。这将为您的机器保留给定的IP地址。