Кажется, что поток не запускает функцию в C # с использованием TcpClient - PullRequest
0 голосов
/ 04 января 2019

Я делаю приложение чата клиент / сервер, используя 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));
        }

Мой интерфейс сообщений и класс результатов довольно просты, поэтому я не думаю, что они необходимы

Я хочу понять, почему у меня ошибка сериализации и почему моя функция не работает. Заранее спасибо за помощь!

...