【问题标题】:Android emulator port forwarding results in ERR_EMPTY_RESPONSEAndroid 模拟器端口转发导致 ERR_EMPTY_RESPONSE
【发布时间】:2021-12-31 11:09:58
【问题描述】:

我的场景如下。我有一个 Android 模拟器,它通过一个应用程序托管一个 EmbedIO Web 服务器。当我尝试从主机 (Mac) 浏览器访问 Web 服务器的 URL 时,我收到 ERR_EMPTY_RESPONSE 错误。

我已通过 ADB 发出以下端口转发命令: adb forward tcp:8080 tcp:8080

在浏览器中,我正在导航到:http://localhost:8080/api/ChangeBackGround 并且 Android 模拟器 Web 服务器正在监听:http://10.0.2.16:8080/api/ChangeBackGround

这是在 Xamarin Forms 应用程序(在 Android 模拟器上运行)中启动 Web 服务器的代码:

public static class WebServerFactory
{
    public static WebServer CreateWebServer<T>(string url, string baseRoute)
        where T : WebApiController, new()
    {
        var server = new WebServer(url)
            .WithWebApi(baseRoute, api => api.WithController<T>());

        // Listen for state changes.
        server.StateChanged += (s, e) => Debug.WriteLine($"WebServer New State - {e.NewState}");

        return server;
    }
}

public class EventController : WebApiController
{
    [Route(HttpVerbs.Get, "/ChangeBackGround")]
    public void ChangeBackGround()
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            App.Current.MainPage.BackgroundColor = Color.Green;
        });
    }
}

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        MainPage = new MainPage();
    }

    private WebServer _WebServer;

    protected override void OnStart()
    {
        var localIPAddress = GetLocalIPAddress();
        var url = $"http://{localIPAddress}:8080";

        Task.Factory.StartNew(async () =>
        {
            _WebServer = WebServerFactory.CreateWebServer<EventController>(url, "/api");
            await _WebServer.RunAsync();
        });

        ((MainPage)MainPage).Url = url;
    }

    private string GetLocalIPAddress()
    {
        var IpAddress = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault();

        if (IpAddress != null)
            return IpAddress.ToString();

        throw new Exception("Could not locate IP Address");
    }

    protected override void OnSleep()
    {
    }

    protected override void OnResume()
    {
    }
}

该方案目前适用于 iOS 模拟器和 Android 物理设备。但即使我设置了端口转发规则,我也总是得到 ERR_EMPTY_RESPONSE。

任何帮助将不胜感激。

【问题讨论】:

    标签: xamarin.forms android-emulator adb embedio


    【解决方案1】:

    请首先确保您的安卓模拟器可以正常连接互联网。

    如果问题仍然存在,您可以尝试以下方法:

    方法一:

    1.以管理员身份启动您的Command prompt

    2.依次运行以下命令:

    netsh int ip reset c:\resetlog.txt
    
    netsh winsock reset
    
    ipconfig /flushdns
    
    exit
    

    方法二:(如果方法一不行,试试方法二)

    打开你的Control Panel-->NetWork and Internet-->Network and Sharing Center-->Change adapter settings-->右击Ethenet并点击Properties-->选择Internet Protocol 4-->点击Properties -->using the following NDS server addresses

    填写如下配置:

    Preferred NDS Server: 1.1.1.1
    
    Alternate NDS Server: 1.0.0.1
    

    方法3:(如果以上方法都不起作用,请尝试方法3)

    在你的电脑上打开Settings-->打开NetWork and Internet-->点击Nnetwork reset-->按Reset Now

    注意:

    更多详情,您可以在浏览器中输入关键字How to fix "ERR_EMPTY_RESPONSE" Error [2021],然后您会找到相关教程。

    【讨论】:

      【解决方案2】:

      您应该让您的服务监听这些 IP 之一:

      • 127.0.0.1:模拟设备环回接口(首选,我认为您没有理由使用其他接口)
      • 10.0.2.15:模拟设备网络/以太网接口

      https://developer.android.com/studio/run/emulator-networking#networkaddresses

      【讨论】:

        猜你喜欢
        • 2016-12-20
        • 1970-01-01
        • 2020-01-22
        • 2015-12-28
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2011-03-17
        • 2012-06-05
        相关资源
        最近更新 更多