TCP 套接字实现在 Xamarin.Android 中的工作方式是否不同?

Does TCP Socket Implementation Work Differently in Xamarin.Android?

我正在尝试使用 System.Net.Sockets.TcpClient 在我的 Xamarin Android 应用程序中建立 TCP 连接。

当我在控制台应用程序上连接时,连接非常好。但是,当我在我的 android 应用程序中使用完全相同的代码时,我在 tcpClient.Connect("127.0.0.1", 6121); 上得到一个异常,说 "System.Net.Sockets.SocketException (0x80004005): Connection refused"。因为它是 Xamarin Android,所以我需要做些不同的事情吗?下面是我的代码。感谢您的帮助!

using Android.App;
using Android.OS;
using System;
using System.Net.Sockets;

namespace App1
{
    [Activity(Label = "App1", MainLauncher = true)]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            Connect();
        }

        public void Connect()
        {
            try
            {
                TcpClient tcpClient = new TcpClient();
                tcpClient.Connect("127.0.0.1", 6121);
            }
            catch(Exception){}
        }
    }
}

无论您是否可以在主线程上进行网络操作(正如@ÖmerBaş 评论的那样),您都会遇到一个更基本的网络概念问题,从而导致您的错误。

127.0.0.1 always 指程序运行正在运行的机器。

当您在控制台中 运行 您的代码时,127.0.0.1 指的是您正在使用的 PC,并且可能是 TCP 服务器所在的 运行ning。

当您 运行 Android 上的代码时,127.0.0.1 指的是 Android 设备本身。您的错误消息显示 "Connection refused." 那是因为您的 TCP 服务器未 运行 在 Android 设备上。在您的 PC 上 运行ning。

您需要知道您的 Android 设备可以使用哪个 IP 地址连接到您的 PC。

如果您使用的是真正的 Android 设备,则需要让您的 Android 设备通过 WiFi 连接到与您的 PC 相同的网络。然后你就可以在你的代码中使用你电脑的IP地址了。

对于模拟器,有两种可能性:

  1. Google 模拟器:10.0.2.2 是从 Android 看到的您的 PC 地址。
  2. Microsoft 模拟器:169.254.80.80 是从 Android.
  3. 中看到的您的 PC 地址

(模拟器地址取自here.)

确保将您的 TCP 服务绑定到所有 IP 地址,而不仅仅是 127.0.0.1。

An alternative solution is to use adb to set up port forwarding on your Android device (whether simulated or real.)


我认为 "network access on the main thread" 问题更多的是 "should not" 而不是 "cannot." Ömer Baş 提到的问题显示 "permission denied" 错误而不是指向的东西线程问题。