使用 System.net.Sockets 连接时无法显示在 UI 上收到的消息
Unable to display the messages received on UI when using System.net.Sockets connection
我是 xamarin.forms 的新手。我想构建一个可以使用 System.net.Sockets 接收消息的 xamarin 表单应用程序。我的问题是我能够接收消息但无法在 UI.
上显示消息
我使用的是依赖服务,所以我在每个平台上都具体实现了socket方法,这是我在Android项目中的socket receive方法。我正在尝试使用消息中心将数据从 android 项目发送到 PCL 项目。 IResource 是我在 PCL.
中定义的 class
class SocketConnection : ISocket
{
Socket sSocket;
Socket serverSocket;
public void ReceiveMessage()
{
Int32 port = 7777;
IPAddress address = IPAddress.Parse("192.168.2.100");
IPEndPoint ipe = new IPEndPoint(address, port);
sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sSocket.Bind(ipe);
sSocket.Listen(0);
//receive message
serverSocket = sSocket.Accept();
Console.WriteLine("connection succeeded");
while (true)
{
byte[] recByte = new byte[4096];
int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
IResource.data1+=Encoding.ASCII.GetString(recByte, 0, bytes);
MessagingCenter.Send<ISocket, string>(this,"new Messages",IResource.data1);
Console.WriteLine("client: " + IResource.data1);
//send message
if (IResource.data1.Equals("exit"))
{
break;
}
}
serverSocket.Close();
sSocket.Close();
}
}
而在我的 pcl 项目中,我有一个按钮,当单击此按钮时,它将调用 ReceiveMessage() 方法。而且我也用过消息中心接收消息并显示在UI上,但是没有成功。这是按钮点击的方法。有谁知道问题出在哪里,是我没有正确使用消息中心,还是其他原因。 plus: 当点击按钮时, UI 变得无响应,我应该使用异步编程吗?以及如何?
提前致谢!
private async void Yes_Clicked(object sender, EventArgs e)
{
MessagingCenter.Subscribe<ISocket,string>(this,"new Messages", (socket, data) =>
{
Device.BeginInvokeOnMainThread(() => {
editor.IsVisible = true;
editor.Text = data;
});
});
DependencyService.Get<ISocket>().ReceiveMessage();
}
where is the problem, is that i am not using messaging center correctly, or something else. plus: when the button is clicked, the UI becomes unresponsive, should I use asynchronous programming?
您正在使用 while 循环阻塞 UI 线程。如果您希望 UI 响应,您需要启动一个新线程:
Thread thread = new Java.Lang.Thread(() => {
while (true)
{
...
MessagingCenter.Send<ISocket, string>(this, "new Messages", data1);
...
});
thread.Start();
我是 xamarin.forms 的新手。我想构建一个可以使用 System.net.Sockets 接收消息的 xamarin 表单应用程序。我的问题是我能够接收消息但无法在 UI.
上显示消息我使用的是依赖服务,所以我在每个平台上都具体实现了socket方法,这是我在Android项目中的socket receive方法。我正在尝试使用消息中心将数据从 android 项目发送到 PCL 项目。 IResource 是我在 PCL.
中定义的 classclass SocketConnection : ISocket
{
Socket sSocket;
Socket serverSocket;
public void ReceiveMessage()
{
Int32 port = 7777;
IPAddress address = IPAddress.Parse("192.168.2.100");
IPEndPoint ipe = new IPEndPoint(address, port);
sSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sSocket.Bind(ipe);
sSocket.Listen(0);
//receive message
serverSocket = sSocket.Accept();
Console.WriteLine("connection succeeded");
while (true)
{
byte[] recByte = new byte[4096];
int bytes = serverSocket.Receive(recByte, recByte.Length, 0);
IResource.data1+=Encoding.ASCII.GetString(recByte, 0, bytes);
MessagingCenter.Send<ISocket, string>(this,"new Messages",IResource.data1);
Console.WriteLine("client: " + IResource.data1);
//send message
if (IResource.data1.Equals("exit"))
{
break;
}
}
serverSocket.Close();
sSocket.Close();
}
}
而在我的 pcl 项目中,我有一个按钮,当单击此按钮时,它将调用 ReceiveMessage() 方法。而且我也用过消息中心接收消息并显示在UI上,但是没有成功。这是按钮点击的方法。有谁知道问题出在哪里,是我没有正确使用消息中心,还是其他原因。 plus: 当点击按钮时, UI 变得无响应,我应该使用异步编程吗?以及如何?
提前致谢!
private async void Yes_Clicked(object sender, EventArgs e)
{
MessagingCenter.Subscribe<ISocket,string>(this,"new Messages", (socket, data) =>
{
Device.BeginInvokeOnMainThread(() => {
editor.IsVisible = true;
editor.Text = data;
});
});
DependencyService.Get<ISocket>().ReceiveMessage();
}
where is the problem, is that i am not using messaging center correctly, or something else. plus: when the button is clicked, the UI becomes unresponsive, should I use asynchronous programming?
您正在使用 while 循环阻塞 UI 线程。如果您希望 UI 响应,您需要启动一个新线程:
Thread thread = new Java.Lang.Thread(() => {
while (true)
{
...
MessagingCenter.Send<ISocket, string>(this, "new Messages", data1);
...
});
thread.Start();