Невозможно отобразить сообщения, полученные в пользовательском интерфейсе при использовании соединения 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();