Я делаю приложение чата клиент / сервер, используя C # и многопоточность. Мое приложение работает хорошо, пока я не создаю поток на клиенте, который должен работать в фоновом режиме, чтобы проверить, пытается ли кто-нибудь отправить мне сообщение. Моя функция получения сообщения через TcpClient работает хорошо, но когда я помещаю его в поток, кажется, что он не работает. Сообщение (то, которое должно приниматься постоянно), которое я отправлял, отображается, когда мой клиент получает обычное сообщение с сервера.
Я пробовал несколько способов запустить функцию (с внешним классом, с функциями непосредственно в классе клиента ...) Иногда я не знаю, почему это дает мне эту ошибку:
System.Runtime.Runtime.Serialization.Serialization.SerializationException:
"The input stream is not a valid binary format.
Я пытался отобразить содержимое десериализации в функции, но моя консоль в тот момент зависала.
Я запускаю свою ветку таким образом (в клиенте)
public void start()
{
TcpClient comm = new TcpClient(hostname, port);
Console.WriteLine("Connection established");
Thread th = new Thread(new ClientReceiver(comm,this).receiveMessage);
th.Start();
while (true)
{
menu1(comm);
}
}
Небольшой фрагмент кода клиента (который хорошо работает без потока)
public void createTopic(TcpClient comm)
{
Console.WriteLine("Vous allez créer un topic, entrez le nom du topic que vous voulez créer");
string expr = Console.ReadLine();
//envoie du nom du topic
Net.sendMsg(comm.GetStream(), new Result(expr, false));
//envoie de l'objet utilisateur
Net.sendObject(comm.GetStream(), new Result(u, false));
Console.WriteLine((Result)Net.rcvMsg(comm.GetStream()));
}
Вот функция, которую я запускаю (в классе ClientReceiver)
public void receiveMessage()
{
if (client.isConnected())
{
while (true)
{
Result resRequest = (Result)Net.rcvMsg(comm.GetStream());
Console.WriteLine(resRequest);
}
}
}
Это мой класс, который я использую для передачи сообщений по сети
public static void sendMsg(Stream s, Message msg)
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(s, msg);
}
public static Message rcvMsg(Stream s)
{
BinaryFormatter bf = new BinaryFormatter();
return (Message)bf.Deserialize(s);
}
Моя функция отправки сообщения
public void notifyUser(TcpClient clientToNotify, String textToSend)
{
Net.sendMsg(clientToNotify.GetStream(), new Result(textToSend));
}
Мой интерфейс сообщений и класс результатов довольно просты, поэтому я не думаю, что они необходимы
Я хочу понять, почему у меня ошибка сериализации и почему моя функция не работает.
Заранее спасибо за помощь!