使用System.net.Sockets连接时无法显示在UI上收到的消息

时间:2018-03-04 23:01:46

标签: android sockets xamarin.forms messagingcenter

我是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();  


}

1 个答案:

答案 0 :(得分:0)

  

问题出在哪里,就是我没有正确使用消息中心或其他东西。加:当单击按钮时,UI变得没有响应,我应该使用异步编程吗?

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

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

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

...               
});
thread.Start();