gpt4 book ai didi

C# 套接字发送序列化数据

转载 作者:可可西里 更新时间:2023-11-01 02:34:22 24 4
gpt4 key购买 nike

我在通过 TCP/IP 套接字连接发送序列化数据时遇到问题。

我的发送函数如下所示:

public void SendData(NetworkConnection connection, ReplicableObject ro) {
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, ro);

ms.WriteTo(connection.TcpStream);
connection.TcpStream.Flush();

ms.Close();
}

我知道目前 TcpStream.Flush() 没有做任何事情。无论如何,这不是我的问题。

在接收(客户端)端,阅读器看起来像这样:

byte[] readBuffer = new byte[8192];
worldMapStream = worldMapConnection.GetStream();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
IsConnectedToWorldMap = true;
while (true) {
try {
do {
int bytes = worldMapStream.Read(readBuffer, 0, readBuffer.Length);
ms.Write(readBuffer, 0, bytes);
}
while (worldMapStream.DataAvailable);

try {
ReplicableObject ro = (ReplicableObject) bf.Deserialize(ms);
ro = ro;
}
catch (Exception e) {
e = e;
}
}

奇怪的 ro = ro 和 e = e 行就在那里,所以我可以添加一个断点。

我的问题是:读取总是失败。我捕获到一个异常,消息解释说在解析完成之前已到达流的末尾。现在,我知道数据可能不会全部到达一个 block ,但是我没有在捕获异常时清除内存流,所以下一个 block 应该只是将剩余的数据添加到它的末尾,对吗?但这显然行不通。

那么,我做错了什么?提前致谢。 :)

附言我知道 WCF 是更好的选择;但不幸的是我不能在这个项目中使用它。

最佳答案

开始吧:

while (worldMapStream.DataAvailable);

应该是:

while(bytes>0);

这也意味着将 bytes 移出循环。

DataAvailable 只是表示“现在,在 NIC”。它不会告诉你是否会有更多。此外,当bytes>0 时,您也应该Write;老实说,while 循环在这里更简单 :)

然后;填充 ms 后设置 ms.Position = 0 以倒回 te 流。

关于C# 套接字发送序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6862405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com