TMemoryStream传输的问题(100分)

  • 主题发起人 主题发起人 METALLEE
  • 开始时间 开始时间
M

METALLEE

Unregistered / Unconfirmed
GUEST, unregistred user!
我在memorystream里保存了一段文件流,在memorystream的前13个字节里我希望插入13个字符以做标志,通过NMUDP传输 NMUDP收到字节后报错stream read error

写入流的代码是:
var
TempStream:TMemoryStream;
FileStream:TFileStream;
SendMsg:string;
`````
````

SendMsg:='...';(十三个字符)
TempStream.Write(SendMsg[1],13);
TempStream.CopyFrom(FileStream,2048);
try
FUDP.SendStream(TempStream);
finally
end;

接收代码:
TempStream := TMemoryStream.Create;
try
FUDP.ReadStream(TempStream);
finally
end;

运行到FUDP.ReadStream(TempStream);时报错stream read error


高手告诉我这个问题如何解决?
 
我也遇到过具体问题,
我记得当时的解决办法是把自己的数据写在流的后面
在 TempStream.Write(SendMsg[1],13) 之前写
TempSteram.Position:=TempStream.Size;
最后记得恢复
TempStream.Position:=0;

原因可能是因为TMemorySteam的结构中把流的大小写在前四个字节中,
(后来我分析过源代码,也没有这回事.)
如果这样还不能解决的话,你就把TMemoryStream作两次发送,
一次可能发送不了这么大的数据包,
不过TClientSocket的SendStream就没有这样的问题,因为
TClientSocket.SendStream就是分割了包的大小
 
看我的例子

http://gujie.zhibo.net
 
三楼的朋友你的例子我看了``````里面好像没有关于文件流传输的功能`````也没有关于文件流与字符共存的代码````:~(

 
udp一个包最好控制在 480字节以内,再大就分包,而且
我不建议用TStream来操作,这样效率不够,直接用指针
来操作最好!
 
copyfrom的实际操作是先把流清空,再拷入,
所以你用一个memorystream取前十三个字符,然后用另一个取文件流,最后把两个用copytomemory的方法拷贝到另外一个流中就可以了,同时要注意读之前注意流的定位
 
to 张无忌!
不知道你还记不记得我, 我用QQ和你聊过,我知道你在DFW排名比较高!
我不知道你的480是怎么来的,不过Delphi中的TSocketStream.SendStream
中Borland把块大小分割成8192.
还有TStream用的就是指针,Borland定义TStream目的在于方便我们的使用,提高开发
效率!
 
如果你想知道480的来历,你可以找找大富翁论坛以前的一个轮子日记,里面有详细的说明,
 
http://61.132.118.185:8080/dispdocnew.php?id=4228
上面是我的一个UDP控件,我想应该比nmudp好用,
 
To 张无忌:
我没有时间,我估计没有什么太多的道理!
我大学时曾用UDP协议写过一个可以支持十万人在线的聊天程序,
可以传输文件, 经过我的测试, 2048-8192是比较可靠快速的,
当然480也可以甚至481(不是8的整倍数)都可以,只是效率问题!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
807
import
I
后退
顶部