首页 > 解决方案 > Xamarin.Android 与控制台应用程序 (Websockets) 通信

问题描述

我有这个控制台应用程序 websocket 服务器:

Console.WriteLine("[SERVER]");

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80);
server.Start();
Console.WriteLine("Server has started on {0}.{1}Waiting for a connection...", server.LocalEndpoint, Environment.NewLine);

TcpClient client = server.AcceptTcpClient(); //wait for client to connect
Console.WriteLine("A client connected.");

NetworkStream stream = client.GetStream(); //communication channel with client

如何连接到 Xamarin.Android 应用中的控制台应用服务器?

我已经尝试过了(在 xamarin android 应用程序中,单击按钮的事件):但我从 'client.Connect("127.0.0.1", 80);' 得到一个异常

异常= System.Net.Sockets.SocketException:连接被拒绝

requestSpeak.Click += (o, e) =>
{
TcpClient client = new TcpClient();
client.Connect("127.0.0.1", 80); //connect to sv
NetworkStream stream = client.GetStream(); //communication channel with server
};

标签: c#xamarinwebsocketxamarin.formsxamarin.android

解决方案


无论您使用的是模拟器还是硬件设备,移动应用程序都将有效地被视为网络上的外部设备。有很多方法可以做到这一点,但对于开发,我更喜欢下载Fiddler并按照本文档中的描述设置反向代理。因此,在打开“允许远程计算机连接”后,我将这样的规则添加为OnBeforeRequest函数的第一行:

if (oSession.host.toLowerCase() == "192.168.0.5:8888") oSession.host = "127.0.0.1:80";

...其中 192.168.0.5 是运行控制台应用程序的机器的 IP 地址。如果您已经正确设置,那么您也应该能够从手机的浏览器中访问 192.168.0.5:8888。

就像我说的那样,还有其他方法可以做到这一点,但我发现这个方法效果很好,因为您可以将规则更改为直接指向 localhost:someport,这是 MVC 应用程序默认用于本地调试的方法;在 VS 模拟器中运行 Xamarin 应用程序(例如),这意味着您可以在同一个项目中调试移动应用程序和服务器代码。通过 Fiddler 重定向所有流量,您可以查看移动应用程序和服务器之间的每个数据包,完全支持 JSON、图像以及压缩和 SSL 内容。


推荐阅读