我正在尝试使用以下命令在我的 Xamarin Android 应用程序中建立 TCP 连接System.Net.Sockets.TcpClient
.
当我在控制台应用程序上执行此操作时,连接非常好。但是,当我在 Android 应用程序中使用完全相同的代码时,出现异常tcpClient.Connect("127.0.0.1", 6121);
说“System.Net.Sockets.SocketException(0x80004005):连接被拒绝”。因为它是 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.1always指的是程序正在运行的机器。
当您在控制台中运行代码时,127.0.0.1 指的是您正在使用的 PC,并且可能是 TCP 服务器正在运行的地方。
当您在 Android 上运行代码时,127.0.0.1 指的是 Android 设备本身。您的错误消息显示“连接被拒绝”。那是因为您的 TCP 服务器未在 Android 设备上运行。它正在您的 PC 上运行。
您需要知道您的 Android 设备可以使用哪个 IP 地址连接到您的 PC。
如果您使用的是真正的 Android 设备,则需要将 Android 设备通过 WiFi 连接到与 PC 相同的网络。然后您可以在代码中使用 PC 的 IP 地址。
对于模拟器来说,有几种可能性:
- Google 模拟器:10.0.2.2 是从 Android 中看到的 PC 地址。
- 微软模拟器:169.254.80.80是从Android上看到的PC地址。
(模拟器地址取自here. https://forums.xamarin.com/discussion/87881/cant-access-localhost-from-android-windows-emulator)
确保将 TCP 服务绑定到所有 IP 地址,而不仅仅是 127.0.0.1。
另一种解决方案是使用 adb 在 Android 设备上设置端口转发(无论是模拟的还是真实的)。 https://stackoverflow.com/questions/13401161/android-to-computer-via-tcp-ip
我认为“主线程上的网络访问”这个事情更多的是一个“不应该”的问题,而不是“不能”的问题。 Ömer Baş 提到的问题显示“权限被拒绝”错误,而不是指向线程问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)