udp发送数据的问题(RTF数据发送) ( 积分: 100 )

  • 主题发起人 主题发起人 tswhq
  • 开始时间 开始时间
T

tswhq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠清注意:我的意思是将RxRichEdit1中的RTF图文混排数据通过Udp发送到远端
...
TempStream:=TMemoryStream.Create;
RxRichEdit1.Lines.SaveToStream(TempStream);
UDPServer.SendBuffer(ServerIP,ServerPort,TempStream.Memory^,TempStream.Size);
TempStream.Free;
...
为何RTF只有文字信息时发送接收正常,有图形数据时服务端接收不到?
TempStream.Memory的数据(开始部分)
{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052{/fonttbl{/f0/fnil/fcharset134 MS Sans Serif;}}
/viewkind4/uc1/pard/lang2052/f0/fs18 ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210{/pict/wmetafile8/picw529/pich529/picwgoal300/pichgoal300
0100090000039002000000007a0200000000050000000b0200000000050000000c02110211027a
020000430f2...太多
我输入的是
ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210+笑脸

新发现: TempStream压缩后可发送数据,但是,表情不能太多,不能在开始位置放一个以上表情
TempStream.SaveTofile('d:/rtf.txt');数据正常,而且读回来也能正常显示
 
各位大侠清注意:我的意思是将RxRichEdit1中的RTF图文混排数据通过Udp发送到远端
...
TempStream:=TMemoryStream.Create;
RxRichEdit1.Lines.SaveToStream(TempStream);
UDPServer.SendBuffer(ServerIP,ServerPort,TempStream.Memory^,TempStream.Size);
TempStream.Free;
...
为何RTF只有文字信息时发送接收正常,有图形数据时服务端接收不到?
TempStream.Memory的数据(开始部分)
{/rtf1/ansi/ansicpg936/deff0/deflang1033/deflangfe2052{/fonttbl{/f0/fnil/fcharset134 MS Sans Serif;}}
/viewkind4/uc1/pard/lang2052/f0/fs18 ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210{/pict/wmetafile8/picw529/pich529/picwgoal300/pichgoal300
0100090000039002000000007a0200000000050000000b0200000000050000000c02110211027a
020000430f2...太多
我输入的是
ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210+笑脸

新发现: TempStream压缩后可发送数据,但是,表情不能太多,不能在开始位置放一个以上表情
TempStream.SaveTofile('d:/rtf.txt');数据正常,而且读回来也能正常显示
 
UDP协议限制包<64k
 
呵呵!我看了一下长度,TempStream.Size=2916字节,UDPServer.BufferSize=32767
 
分段循环发送呢?
 
你应该发送一个RECORD.在对方保存笑脸图片,在收到后,根据RECORD载入.
 
to ZBJ2001_KF:
你应该发送一个RECORD.在对方保存笑脸图片,在收到后,根据RECORD载入.

你的意思是要分开发送数据吗?但是有可能有好多表情要发送,那就太慢了

我现在不明白的是,发送普通数据可以,为何发送图像数据时就好象没发送?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=726166

我以前直接用Socket的时候是分包发送的,当接受到的数据比设定的Buffer小时说明已经传完了。不过我们定义了协议头

下面的例子是网上的,看看有没有参考价值
http://www.delphibbs.com/delphibbs/dispq.asp?LID=156184
用TServerSocket和TClientSocket的sendstream方法好象一次最大只能发送
8k的数据,如果大于8k就会出错。Aloney的方法我在D4上试过,如果图片小的
话没问题,大于8K的话就什么也收不到。

我采用拼接的方法实现了任意大小文件的传送(还是有些限制的,下面我将要说
明),以下程序在D4上调试通过:

Client端:(发方)
private
{ Private declarations }
stream : TMemoryStream;
size,count : integer; //定义全局变量

procedure TForm1.Button2Click(Sender: TObject);
begin
stream := TMemoryStream.Create; //流初始化
if OpenDialog1.Execute then
begin
stream.LoadFromFile(OpenDialog1.FileName);
size := stream.Size;
count := 0; //记录位置
ClientSocket1.Socket.SendText(inttostr(size)); //发送文件大小
end;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
rcvtxt : string;
buf : array [1..8192] of char;
left : integer; //剩余的字节数
begin
rcvtxt := Socket.ReceiveText;
left := size - count; //剩余的字节数
if AnsiPos('go',rcvtxt)=1 then //收方响应了则发送一块
begin
if sizeof(buf)<left then
begin
stream.Read(buf,sizeof(buf));
Socket.SendBuf(buf,sizeof(buf));
count := count + sizeof(buf);
end
else
begin
stream.Read(buf,left);
Socket.SendBuf(buf,left);
end;
end;
end;



Server端:(收方)
private
{ Private declarations }
Tof : file;
size,count :integer;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf : array [1..8192] of char;
rcvtxt : string;
left,len : integer;
begin
len := Socket.ReceiveLength;
if len<10 then //若数据长度少于10位则认为是文件长度
begin
rcvtxt := Socket.ReceiveText;
size := strtoint(rcvtxt);
count := 0;
if SaveDialog1.Execute then
begin
AssignFile(ToF, SaveDialog1.FileName);
Rewrite(ToF, 1);
end;
Socket.SendText('go'); //创立文件后发送一个响应
end
else
begin
left := size - count; //计算剩余字节数
if sizeof(buf)<left then //满一块的则写一块,发送响应
begin
Socket.ReceiveBuf(buf,sizeof(buf));
BlockWrite(Tof,buf,sizeof(buf));
count := count + sizeof(buf);
Socket.SendText('go');
end
else //不满一块则只写剩余的,不用响应
begin
Socket.ReceiveBuf(buf,left);
BlockWrite(Tof,buf,left);
CloseFile(Tof);
end;
end;
end;

由于我的控制条件是用接收的数据长度来判断是否是文件流,对于长度小于10
bytes或长度模8192小于10的文件并不适用,但只要改变一下这个条件则可以
应用于大多数情况了
 
to chenybin
大侠我不是发文件,我发送的是含有图文的RTF数据
当只有文字时发送接收正常
当有图象时,能发送不报错,服务端接收不到

因为我发送的是数据流,是不是应该和格式无关呢?
 
刚刚看了下例子,stream是全局变量,其实文件读取进来以后也是一个TFileStream,和你说的流道理是一样,真正发送数据的时候也不可能发送文件,如果实在不放心,一个是看服务器端是否接收到数据,用工具测,发送端也是,一个笨办法就是用天网防火墙,它可以知道你的程序是否有数据发送,同样接收也是,格式是表示一个数据流结束与否,和文件格式无关,比如说QQ里面发送一段话,发送完毕以后总要告诉对方我下面不发送了,可以告诉用户了,比如QQ的头像动了等,个人看法,仅供参考
 
很简单,你可以分开调试
首先你本地调试你SAVE的STREAM直接LOAD到另一个RXRICHEDIT中看数据对不对,可行后,再确保你发送的STREAM字节完全正确,我估计是你的STREAM到字节流的转换问题或者是发送接收中的数据不一致
 
感谢大家回帖

to chenybin
我就听你的装个天网防火墙试试

to yangying_2000
我在编写聊天程序,另一个RXRICHEDIT中看数据很正常,我用winhex观察内存,Stream数据正常
 
to chenybin
用天网看不见udp发送接收字节呀?
 请再推荐一款网络监测软件,谢谢!
 
用天网只是举个例子,应该有专门的[blue]网络嗅探工具[/blue]可以看

我用天网2.71
在主界面有个耳朵一样的图标,表示当前系统中引用程序的网络情况
点击就会出来一个列表,有个下拉框,通过他可以选择是TCP协议还是UDP协议,
我用QQ给别人发送消息时,可以看到在什么端口发送了多少数据,以及对方的端口,但是不能看发送了什么数据
 
to chenybin

主界面耳朵里看不见udp的发送接收数据

网络嗅探工具没有具体的软件名称吗?
 
点击耳朵,然后回来一个下拉框,下面有软件列表,点开就是了

嗅探工具如SNIFFER,Irail(这个名字记不住了)

下面是sniffer的说明的一个网页
http://www.20cn.net/ns/cn/jc/data/20020812014132.htm

我们这样好像偏离主题了,其实目的是看看数据发了没有,应该在这个方面考虑,另外分步发送是可以理解的
 
天网里看不见udp具体的数据为何?tcp就有,是不是大侠搞混了呀?
我用sniffer看了一下,有数据发送和接收(客户和服务端都在一台机器上测试)
 
联系 QQ:360148594
 
我的意思是一个思路,问题不能很快解决的时候,你应该把整个过程细分,这样虽然慢点但能够很有效率的找到出错的点,然后再去解决就不会钻牛角尖了
 
我顶,请求给点分哈。:)
 

Similar threads

后退
顶部