c# - 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){}
}
}
}
解决方案
无论您是否可以在主线程上进行网络操作(正如@Ö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 地址。
对于模拟器,有两种可能性:
- Google 模拟器:10.0.2.2 是您的 PC 的地址,如 Android 所见。
- Microsoft 模拟器:169.254.80.80 是从 Android 看到的 PC 的地址。
(模拟器地址取自这里。)
确保将您的 TCP 服务绑定到所有 IP 地址,而不仅仅是 127.0.0.1。
另一种解决方案是使用 adb 在您的 Android 设备(无论是模拟的还是真实的)上设置端口转发。
我认为“主线程上的网络访问”这件事更多的是“不应该”而不是“不能”的问题。Ömer Baş 提到的问题显示“权限被拒绝”错误,而不是指向线程问题的东西。
推荐阅读
- ruby - Ruby 在正则表达式模式之前获取几行
- regex - 非捕获组来解析 git 状态
- java - 如何使用 Java 从 SQL Server 数据库中获取一名学生?
- python - 屏蔽数组的 Numpy 元素明智最小值返回有效值而不是屏蔽值
- javascript - 如何将 JSON 对象作为选项值存储在选择标签中?
- javascript - 如何使用来自@types/socket.io 的接口
- json - 如何将字符串解析为浮点数?
- javascript - React JS - onClick 在 setState 的对象内创建一个对象
- javascript - 如何格式化“创建帐户”表单以便 LastPass 保存正确的详细信息
- vba - 如果满足某些“标准”,则将数据从一个 Excel 文件提取到另一个文件的宏