0

我是 xamarin.forms 的新手。我想构建一个可以使用 System.net.Sockets 接收消息的 xamarin 表单应用程序。我的问题是我能够接收消息但无法使消息显示在 UI 上。

我正在使用依赖服务,所以我专门在每个平台上实现了socket方法,这是我在Android项目中的socket接收方法。我正在尝试使用消息中心将数据从 android 项目发送到 PCL 项目。IResource 是我在 PCL 中定义的一个类。

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 上,但没有成功。这是按钮单击的方法。有谁知道问题出在哪里,是我没有正确使用消息中心,还是其他原因。加:当按钮被点击时,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();  


}
4

1 回答 1

0

问题出在哪里,是我没有正确使用消息中心,还是其他原因。加:当按钮被点击时,UI变得无响应,我应该使用异步编程吗?

您正在使用 while 循环阻塞 UI 线程。如果您希望 UI 具有响应性,则需要启动一个新线程:

Thread thread = new Java.Lang.Thread(() => {
while (true)
{
   ...

 MessagingCenter.Send<ISocket, string>(this, "new Messages", data1);

...               
});
thread.Start();
于 2018-03-05T01:29:33.780 回答