2011-12-02 52 views
0

我试图通过ArrayList绑定声音和图像序列数据,以使其同步并通过二进制格式化程序将其序列化以通过网络流发送。 服务器端抛出异常:TCP套接字,在单个网络流C上发送多个对象#

该流无法支持查找操作。

我应该以同步对象做送过来一个单一的网络流实例

回答

3

TCP是基于流而不是基于消息的(就像UDP一样)。这意味着消息开始或结束时不知道。 TCP只保证所有字节都以正确的顺序接收。并不保证所有与Send()一起发送的东西都会收到一个Receive()

因此您需要指定某种消息标识机制。在这种情况下,标题是Jon的建议。

但是,您需要了解整个标题可能不会立即被接收。而这两条消息可能会一次到达。因此,在将任何内容发送到BinaryFormatter进行反序列化之前,您需要解析接收到的缓冲区。

+0

我有两个对象让我们说A和B ...... A包含Mp3帧和B包含位图压缩图像..我绑定了ArrayList中的对象,因为它可以包含它中的对象。然后我序列化它使用BinaryFormatters并通过网络流发送它。但它抛出了我上面列出的例外 – Samie

+1

这是因为一切还没有到。你需要手动建立一个'byte []'缓冲区(或'MemoryStream')。你不能试图反序列化网络流。 – jgauffin

2

我会分裂每个对象要发送到其中一个消息由一个单独的“消息” (说)4个字节表示身体长度,然后是身体本身。

当你想发送一个序列化的对象时,你将序列化成一个字节数组,写出长度,然后写出数据。

在服务器端,读取长度,将大量数据读入字节数组,然后反序列化该消息。传入流只用于读取消息,而不是对象。