带有 Tcp 服务器的 XmlSerializer 和 NetworkStream - 客户端
XmlSerializer and NetworkStream with Tcp Server - Client
我正在尝试将自定义 class
从一个 tcp 客户端传递到另一个客户端(使用 TcpListener
、TcpClient
和 XmlSerializer
)。
我有 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 个客户端的连接。
当我尝试发送另一条消息时出现异常:
The operation is not allowed on non-connected sockets.
那么我如何发送 Serilized 对象而不 中断 连接?
首先,使用像这样的 using
是 通过处理底层流来关闭套接字。坏主意。
其次,考虑序列化到字符串和从字符串序列化,而不是直接序列化到 到 流中。我不确定这样做是否有副作用,但肯定可能。
您可以将此问题用于 string
serialize/deserialize:Deserialize from string instead TextReader
我正在尝试将自定义 class
从一个 tcp 客户端传递到另一个客户端(使用 TcpListener
、TcpClient
和 XmlSerializer
)。
我有 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 个客户端的连接。
当我尝试发送另一条消息时出现异常:
The operation is not allowed on non-connected sockets.
那么我如何发送 Serilized 对象而不 中断 连接?
首先,使用像这样的 using
是 通过处理底层流来关闭套接字。坏主意。
其次,考虑序列化到字符串和从字符串序列化,而不是直接序列化到 到 流中。我不确定这样做是否有副作用,但肯定可能。
您可以将此问题用于 string
serialize/deserialize:Deserialize from string instead TextReader