【发布时间】:2016-04-30 13:53:09
【问题描述】:
我是编程新手。目前我正在编写一个小聊天程序来学习一些东西。
现在我问自己,为什么大家都在谈论流 (NetworkStreams) 作为在 C# 中传输数据的解决方案?
在我的小工具上,我像这样传输(和序列化)数据:
internal void sendMessageObject(Message message)
{
byte[] _data;
BinaryFormatter _bf = new BinaryFormatter();
MemoryStream _ms = new MemoryStream();
_bf.Serialize(_ms, message);
_data = _ms.ToArray();
clientSocket.Send(_data);
}
在接收方是这样的:
private void readData()
{
byte[] buffer;
buffer = new byte[Accepted.Available];
Accepted.Receive(buffer);
MemoryStream ms = new MemoryStream(buffer);
BinaryFormatter bf = new BinaryFormatter();
Message message = (Message) bf.Deserialize(ms);
MainWindow.writeToMessages(
String.Format("[" + message.getMessageTime() +
"] " + message.getNickname() +
": " + message.getMessageText() +
Environment.NewLine));
}
它有什么问题吗?或者使用 Streams 有什么显着优势?
谢谢
【问题讨论】:
-
您发布的代码真的有效吗?网络流的传输层是 TCP。 TCP 发送最大长度约为 1500 字节的数据报。较长的消息是使用在网络驱动程序中组合的多个数据报组成的。在连接的接收端使用网络流将数据保存在单个对象中,而不是以 1500 字节的块的形式获取数据。
-
嘿,是的,它可以工作,但我只尝试了大约 150 字节的简单非常小的对象,这些对象可以放在一个包中。你的意思是如果 a 发送一个大于 1500 字节的对象,它会中断吗?
-
数据超过 1500 字节的代码将尝试使用第一个数据报反序列化(在接收到所有数据之前)。解决方案是在发送时在消息的开头添加一个字节数。然后在接收端删除字节计数并在反序列化之前读取所有字节,以便反序列化整个消息。
-
非常感谢,如果完成了我会贴出代码。回答问题。使用 strams 可以解决多个数据报包含一个数据(对象)的问题!?!
标签: c# networking serialization stream