Невозможно отобразить сообщения, полученные в пользовательском интерфейсе при использовании соединения System.net.Sockets

Я новичок в xamarin.forms. Я хочу создать приложение для форм xamarin, которое может получать сообщения с помощью System.net.Sockets. Моя проблема в том, что я могу получать сообщения, но не могу отображать сообщения в пользовательском интерфейсе.

Я использую службу зависимостей, поэтому я реализовал метод сокетов специально для каждой платформы, это мой метод получения сокетов в проекте Android. Я пытаюсь использовать центр сообщений для отправки данных из проекта 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(). И я также использовал центр сообщений, чтобы получать сообщения и отображать их в интерфейсе, но это не сработало. это метод для нажатия кнопки. кто-нибудь знает, где проблема, в том, что я не использую центр сообщений правильно, или что-то еще. плюс: при нажатии кнопки пользовательский интерфейс перестает отвечать на запросы. Следует ли использовать асинхронное программирование? и как?

Заранее спасибо!

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 ответ

Решение

где проблема, в том, что я не правильно использую центр сообщений, или что-то еще. плюс: при нажатии кнопки пользовательский интерфейс перестает отвечать на запросы. Следует ли использовать асинхронное программирование?

Вы блокируете поток пользовательского интерфейса с помощью цикла while. Вам нужно создать новый поток, если вы хотите, чтобы пользовательский интерфейс реагировал:

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

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

...               
});
thread.Start();
Другие вопросы по тегам