【问题标题】:XmlSerializer and NetworkStream with Tcp Server - ClientXmlSerializer 和 NetworkStream 与 Tcp 服务器 - 客户端
【发布时间】:2015-04-15 01:49:42
【问题描述】:

我正在尝试将自定义 class 从一个 tcp 客户端传递到另一个(使用 TcpListenerTcpClientXmlSerializer)。

我有 1 个问题分成 2 个问题。

当我使用此代码时,客户端在序列化完成时挂起 (我认为对方不知道数据何时完全发送):

public void SendData(myMessage messageClass)
{
    NetworkStream serverStream = tcpServer.GetStream();
    XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
    xmlSrlz.Serialize(serverStream, messageClass);
    serverStream.Flush();
}

public myMessage ReadData()
{
    while (true)
    {
        NetworkStream clientStream = client.GetStream();
        XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
        int bytesToread;
        byte[] inStream = new byte[10025];
        myMessage msg;
        do
        {
            msg = (myMessage)xmlSrlz.Deserialize(clientStream);
            clientStream.Flush();
        }
        while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0));
        return msg;
    }
}

所以,当我四处搜索时,我注意到我可以处理流(或使用using),这样就可以让对方知道数据已完全发送并且没有更多数据要发送:

public void SendData(myMessage messageClass)
{
    using (NetworkStream serverStream = tcpServer.GetStream())
    {
        XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));
        xmlSrlz.Serialize(serverStream, messageClass);
        serverStream.Flush();
    }
}

public myMessage ReadData()
{
    while (true)
    {
        using (NetworkStream clientStream = client.GetStream())
        {
            XmlSerializer xmlSrlz = new XmlSerializer(typeof(myMessage));

            int bytesToread;
            byte[] inStream = new byte[10025];
            myMessage msg;
            do
            {
                msg = (myMessage)xmlSrlz.Deserialize(clientStream);
                clientStream.Flush();
            }
            while (((bytesToread = clientStream.Read(inStream, 0, (int)client.ReceiveBufferSize)) > 0));
            return msg;
        }
    }
}

但现在我失去了他们 2 个客户端的连接。

当我尝试发送另一条消息时,我得到了异常:

在未连接的套接字上不允许该操作。

那么我怎样才能在不破坏 连接的情况下发送序列化对象?

【问题讨论】:

    标签: c# tcpclient xmlserializer tcplistener networkstream


    【解决方案1】:

    首先,使用using 这样的方法是通过处理底层流来关闭您的套接字。坏主意。

    其次,考虑序列化到字符串和从字符串序列化,而不是直接序列化流。我不确定这样做是否有副作用,但肯定有可能

    您可以使用此问题从string 序列化/反序列化:Deserialize from string instead TextReader

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2023-03-18
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多