我正在尝试将一个自定义class从一个tcp客户机传递到另一个tcp客户机(使用TcpListener、TcpClient和XmlSerializer)。
我有一个问题分解成两个问题。
当我使用此代码时,客户端在执行Serilization时挂起(我认为另一方不知道数据何时被完全发送):
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;
        }
    }
}但现在我失去了他们两个客户的联系。
当我试图发出另一个信息时,我得到了一个例外:
不允许对未连接的套接字进行操作。
那么,如何在不破坏连接的情况下发送服务器化对象?
发布于 2015-02-13 22:44:41
首先,使用这样的using就是通过处理底层流来关闭套接字。馊主意。
第二,考虑将字符串序列化,而不是直接序列化到流中。我不确定这样做是否有副作用,但肯定有可能。
可以使用此问题从string:Deserialize from string instead TextReader序列化/反序列化
https://stackoverflow.com/questions/28509446
复制相似问题