首页 > 解决方案 > TCP 套接字实现在 Xamarin.Android 中的工作方式是否不同?

问题描述

我正在尝试在我的 Xamarin Android 应用程序中使用System.Net.Sockets.TcpClient.

当我在控制台应用程序上进行连接时,连接非常好。但是,当我在我的 android 应用程序中使用完全相同的代码时,我得到一个异常tcpClient.Connect("127.0.0.1", 6121);说“System.Net.Sockets.SocketException (0x80004005): Connection denied”。因为它是 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){}
        }
    }
}

标签: c#androidxamarintcptcpclient

解决方案


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

127.0.0.1总是指运行程序的机器。

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

在 Android 上运行代码时,127.0.0.1 指的是 Android 设备本身。您的错误消息显示“连接被拒绝”。那是因为您的 TCP-Server 没有在 Android 设备上运行。它正在您的 PC 上运行。

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

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

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

  1. Google 模拟器:10.0.2.2 是您的 PC 的地址,如 Android 所见。
  2. Microsoft 模拟器:169.254.80.80 是从 Android 看到的 PC 的地址。

(模拟器地址取自这里。

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

另一种解决方案是使用 adb 在您的 Android 设备(无论是模拟的还是真实的)上设置端口转发。


我认为“主线程上的网络访问”这件事更多的是“不应该”而不是“不能”的问题。Ömer Baş 提到的问题显示“权限被拒绝”错误,而不是指向线程问题的东西。


推荐阅读