我尝试将自定义class
从一个tcp客户端传递到另一个(使用TcpListener
,TcpClient
和XmlSerializer
)。
我遇到了1个问题,分为2个问题。
当我使用此代码时,客户端会在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;
}
}
}
但现在我失去了他们与2个客户的联系。
当我试图发送另一条消息时,我得到例外:
非连接套接字上不允许进行此操作。
那么如何在没有打破 连接的情况下发送已提升对象?
答案 0 :(得分:0)
首先,使用类似的using
关闭套接字,方法是处理基础流。不好的主意。
其次,考虑在字符串中进行序列化,而不是直接将序列化到流中。我不确定这样做是否有副作用,但肯定可以。
您可以使用此问题从string
序列化/反序列化:Deserialize from string instead TextReader