流的使用:将数据存入流中,读出来却为空!!(50分)

  • 主题发起人 DiamondKing
  • 开始时间
D

DiamondKing

Unregistered / Unconfirmed
GUEST, unregistred user!
在使用UDP协议编程中,我想先将数据存入到流中之后,在发送以提高效率。当客户端读
数据时却发现传输的文本为空,于是做了如下测试。
基本代码如下: ---->注意** 处
var
Buf,NewBuf:array of byte;
i:integer;
Str,NewStr:string;
len,HeadLen:integer;
MyStream:TMemoryStream;
begin
MyStream:=TMemoryStream.Create;
HeadLen:=16;
Str:='大风起兮云飞扬!';
Len:=length(Str);
setLength(Buf,HeadLen+len+1);

//传输文本前加一段16进制校验码 :ABABABABABABABAB 共16位
for i:=0 to Headlen-1 do
begin
if ((i mod 2)=0 ) then Buf:=$A
else Buf:=$B;
end;
//将Str 存储到 Buf
CopyMemory(@Buf[HeadLen],@Str[1],len);
//以#0结尾
Buf[length(buf)-1]:=0;

try
MyStream.Write(buf,headlen+len+1);

setLength(NewBuf,length(buf));
MyStream.Read(NewBuf,Length(Buf));
//--------------------------------------

setLength(NewStr,len); //分配NewStr的长度
CopyMemory(@NewStr[1],@NewBuf[Headlen],len); //从NewBuf 读NewStr
Showmessage(NewStr); //**读出来的为空!!!!!!**
//----------------------------------------Test
finally
MyStream.Free ;
end;

end;
刚存到流中的数据,读出来就为空了。
**读出来的为空!!!!!!**
然后在程序中加入以下代码测试

{ //-----------------------------
for Testi:=0 to Length(Newbuf)-1 do

TestStr:=TestStr+inttohex(NewBuf[Testi],1);
ShowMessage(TestStr);
//-----------------------------
}

居然得到了一大堆的0 .........
一上午都没有能够解决!


 
在MyStream.Read(NewBuf,Length(Buf));之前加上一句:
MyStream.Position:=0;

 
谢谢教父。 真没想到这里! 现在的问题是接受的文本依然为空。
下面是接收端的代码, (传输代码沿用上面代码)
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
Buf:array of byte;
len:integer;
Str:string;
HeadLen:integer;
MyStream:TMemoryStream;
Teststr:string;
Testi:integer;
begin
Showmessage(inttostr(NumberBytes));//显示已经接收到 33个byte
MyStream:=TMemoryStream.Create ;
HeadLen:=16;
SetLength(Buf,NumberBytes);
NMUDP1.ReadStream(MyStream);
try

MyStream.Read(Buf[0],NumberBytes);
//---------------------------------
for Testi:=0 to NumberBytes-1 do

TestStr:=TestStr+inttohex(Buf[Testi],1);
ShowMessage(TestStr); //***可以得到16进制码,但与传输的码不一样。!**
//---------------------------------test

setLength(Str,NumberBytes-HeadLen-1);
CopyMemory(@Buf[HeadLen],@Str[1],NumberBytes-HeadLen-1);

ShowMessage(Str);//**此处显示为空**
finally
MyStream.Free;
end;


end;
 
看不出来了,你给我个E-Mail,我把我以前写的NetICQ发给你吧,也是用的UDP协议
 
先谢谢了!Email 是zcgjerry@163.com
 
教父大侠:急等你帮忙!
 
我也需要
wolfteeth@21cn.com
 
我也需要
dtjs@yeah.net
 
for Testi:=0 to NumberBytes-1 do 这句后面应该加上 Begin … end;
Begin 你要循环执行的代码 end;
 
YB_unique:我只要执行 TestStr:=TestStr+inttohex(Buf[Testi],1);
所以不需要Begin ..end
这里只不过是个检测,问题肯定不是出在这里。

 
上面三位,前几天因为收不到邮件回复,所以一直找不到这个问题了,现在已经给你们发
了,请查收。
 
对了,可能是下面这句有问题:
MyStream.Read(Buf[0],NumberBytes);
改成:
MyStream.Read(Buf,NumberBytes);
再试试看。
 
to 教父: 原来如此,我想教父不至于把我们给凉着吧.
但没有能够收到你的邮件啊! 我的email是:zcgjerry@163.com
 
to 教父:
改成:
MyStream.Read(Buf,NumberBytes);
会报错:Access Violation at *******.......
 
你把buf改为PChar,然后再GetMem,读的时候用
MyStream.Read(Buf^,NumberBytes);
再试试 :)

如果你没有收到的话,再换个MAIL吧。
 
仍然没有收到.
还有email: DiamondKingChou@163.com 或者是JerryChouZW@yahoo.com.cn
PChar可以吗?它不是指向字符的指针吗?我先试试.
 
搞定了!!!!!谢谢教父.
代码为:
var
Str:string;
MyStream:TMemoryStream;
Buf: PChar;
HeadLen:integer;
begin
HeadLen:=16;
MyStream:=TMemoryStream.Create;
GetMem(Buf,NumberBytes);
//SetLength(buf,NumberBytes);
SetLength(str,NumberBytes);
try
NMUDP1.ReadStream(MyStream);
MyStream.Read(Buf^,NumberBytes);
CopyMemory(@Str[1],@Buf[HeadLen-1],NumberBytes-HeadLen);
ShowMessage(Str);
finally
MyStream.Free;
end;

end;
--------------------------------------------------------
先不结束问题吧.我怕一结束我的NetIcq 就收不到了,^<^ .
--------------------------------------------------------
不介意继续问你问题吧!不够 ,就继续给分.
----------------




 
要写一个使用Tcp协议的企业内部文件传输系统(要具有Email功能)
:使用NMStrmServ,和NMStrm.
当NUMStrmServ ,收到消息时,就开启一个线程,处理从流中获得的数据(包括,文件,
发送人,姓名,或者地址列表等等). 由于对线程技术了解很少.从书上得知,子线程不可以
访问主线程的VCL,那么我想在接受的时候先启动一个进度条显示进度该怎么办?
我收到的文件要存储到库中(ACCESS )该怎么办,可以使用ADO的组件吗?
我收到的文件想让它把图标显示出来,对于那些非.EXE文件,怎么给它赋予图标呢?

传输的基本格式为
ABABABABABABABAB| 文件的首地址 |文件的大小Filesize|文件 |#0 将它先存到Buf:array of
byte 中,然后存入流发送.
当文件的大小在2的32次方内,可以声明 FileSize:integer 可以写成
PInteger(Buf[Position])^=FileSize;
当文件大于2的32次方,比如又5M,或者6M 那么就必需要声明FileSize:int64 但int64
的数据怎么写到Buf.又Pint64(Buf[Position])^=Filesize 这种写法吗?

-------------谢谢,不勉强的.
 
我已经给你的Yahoo的信箱发了一封MAIL,你收收看。
NMStrmServ和NMStrm我没有用过,现在也没有时间试,帮不了你了,不过FastNet的那一
套东西很多BUG,千万不要用它们来做商业程序,我吃过不少苦头的。

关于线程的问题我前一段时间正好在DFW中讨论过一点点,你看看能不能帮到你。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=760828

要把文件存储到库中(ACCESS ),完全可以使用ADO的组件。

图标的问题不太清楚,你看看shGetFileInfo方面的资料试试。

你的那种写法我也不知道对不对,不地为什么你不定义一个结构?内容为:
ABABABABABABABAB| 文件的首地址 |文件的大小Filesize,在写入流的时候把文件的内容
再加到这个结构的后面,这样不可以吗?
 
谢谢! 已经收到了,虽然有几个组件我没有(不过问题不算大),我会尝试看懂它.不懂就问你.
Fastnet 很多BUG的吗?那我就很麻烦了.不过我也没有办法,经理确定了这个项目,
并且要我去执行它,我是不敢发表太多意见的,不然 呵呵我得日子会很难过得.
我只能是尽最大得努力做好它.
有定义一个结构TFile,考虑到传输的文件很多,所以定义了一个TList ,存放PFile(指向Tfile的
指针).
但是往流里面写的时候还是要把结构的每个item分开写的.我一直想绕开这个问题,很难.
"要把文件存储到库中(ACCESS ),完全可以使用ADO的组件。"在子线程里面也可以吗?
我会去看你那个线程的问题的.

 
顶部