【发布时间】:2023-03-21 05:09:01
【问题描述】:
我在两台使用 Windows 窗体的计算机之间建立了 TCP 连接。我有一个整数数组,我使用 XmlSerializer 类对其进行序列化,并使用 StreamWriter 发送它并使用 StreamReader 接收。
发送:
NetworkStream stream = m_client.GetStream(); //m_client is a TCPclient
StreamWriter m_writer = new StreamWriter(stream);
int[] a = new int[3] { 10,20,30 };
XmlSerializer serializer = new XmlSerializer(typeof(int[]));
serializer.Serialize(m_writer, a);
//m_writer.Flush(); //Doesn't help
//m_writer.Close();
在接收端:
TcpClient client = (TcpClient)p_client;
NetworkStream stream = client.GetStream();
StreamReader reader = new StreamReader(stream);
if (stream.CanRead)
{
XmlSerializer serializer = new XmlSerializer(typeof(int[]));
int[] numbers = (int[])serializer.Deserialize(reader);
MessageBox.Show(numbers[0].ToString()); //Is not reached
MessageBox.Show(numbers[1].ToString());
MessageBox.Show(numbers[2].ToString());
}
问题是接收器上的阅读器不会停止阅读,除非我终止连接或关闭发送者端的 m_writer(在这种情况下,我不能使用它再次发送)。如果它不停止读取,则下一行(即 MessageBox.Show(numbers[0].ToString()))将不起作用。
我需要关于如何通知接收者在 30 岁后停止阅读或它如何理解何时停止阅读的建议?
编辑:
我从How to send integer array over a TCP connection in c# 获得了 XMLserializer 的想法
我找到了一个需要终止连接的答案,除非这是唯一可能的方法,否则我宁愿不这样做。 XmlSerializer Won't Deserialize over NetworkStream
【问题讨论】:
-
写完后有没有试过刷
NetworkStream?如果数据没有通过网络发送,阅读器将无限期地等待数据。 -
我尝试过使用 m_writer.flush()。还是不行。
-
您根本不应该使用 TCP 来发送消息。 HTTP 会更合适,因为它会为您处理这个问题。 Web 服务甚至更好,因为它们也处理序列化。
-
对不起,我好像忘了说这是windows窗体