线程似乎没有使用TcpClient在C#中启动函数

时间:2019-01-04 18:46:54

标签: c# .net multithreading serialization tcpclient

我正在使用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));
        }

我的消息接口和结果类非常基础,所以我认为它们不是必需的

我想了解为什么出现序列化错误以及为什么我的功能无法正常工作。 预先感谢您的帮助!

0 个答案:

没有答案