【问题标题】:What is the benefit of streams on network transmissions? (C#)流对网络传输有什么好处? (C#)
【发布时间】: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


【解决方案1】:

只是想将给定的答案总结为最终答案:

简而言之: 大于约 1500 字节的数据包将在接收端出现异常,因为接收方不知道一个完整的段需要多少数据包。

如果您只发送非常小的包裹,并且您可以确定不会分成多个包裹,那么这个解决方案是可以的!否则使用流!

感谢@jdweng​​p>

再见

【讨论】:

    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 2019-11-11
    • 2015-12-19
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多