求救!十六进制的Buffer数组发送后的接收检测(100分)

  • 主题发起人 主题发起人 胡一刀007
  • 开始时间 开始时间

胡一刀007

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用SendBuffer发送后,在接收时总是会自动退出,为什么?
接收时的代码为:
procedure TchatForm.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
RecLength:integer;
TotalByteArr:Array of byte;
I:integer;
TempStr:String;
Socketjpg: TJpegImage;
SocketBmp: TBitmap;
m:tmemorystream;
begin
SocketStatusBar.Panels[0].Text:='客户端'+Socket.RemoteHost+'正在读信息...';

Showmessage('step1');
RecLength:=Socket.ReceiveLength;
Showmessage('step2');

SetLength(TotalByteArr,RecLength);

Showmessage('step3');

Socket.ReceiveBuf(TotalByteArr,RecLength);
Showmessage('step4');

Memo2.Lines.Add(InttoStr(RecLength));
Showmessage('step5');

m.Write(TotalByteArr,RecLength); <----就是这句话出错了!为什么?好象读不出TotalByteArr。但RecLength却是正确的,为什么?
Showmessage('step6');

m.Position:=0;
Socketbmp := TBitmap.Create;
Socketbmp.LoadFromStream(m);
Socketbmp.SaveToFile('c:/MySocket.jpg');
Showmessage('step6');
Socketbmp.Free;
。。。。
end;
 
你的m还没创建啊!(m:=TmemoryStream.Create)
 
先谢谢你!我犯了一个愚笨的错误,但加上后还是有问题:
m.Position:=0;
Socketbmp := TBitmap.Create;
Socketbmp.LoadFromStream(m);〈-就是到这句,程序又自动退出了!为什么?
Socketbmp.SaveToFile('c:/MySocket.jpg');
Showmessage('step6');
Socketbmp.Free;

 
Socket.ReceiveBuf(TotalByteArr[0],RecLength);
 
动态数组TotalByteArr没有被初始化
SetLength(TotalByteArr,RecLength);
 
To book523:
TotalByteArr本身是byte的数组,每个单元是byte,怎么能
Socket.ReceiveBuf(TotalByteArr[0],RecLength)?
不过,我还是试了一试,虽然编译不会报错,运行时是
Socketbmp.LoadFromStream(m)<-提示:位图格式非法!

To win32asm:
TotalByteArr在setlength后是会自动每个byte单元自动填$00的,故可以不用初始化。
 
圖像格式方面的東西不是很懂。
那篇文章我也沒有試過。

兩個都這樣試試。
Socket.ReceiveBuf(TotalByteArr[0],RecLength)
m.Write(TotalByteArr[0],RecLength);
應該是讀入到以那個地方開始的reclength字節的緩沖區中。
 
我的发送是这样的:
TotalByteArr:array of Byte;

ServerSocket.Socket.Connections[ActiveCount].SendBuf(TotalByteArr,Length(TotalByteArr));
发送时,我还发现sizeof(TotalByteArr)=4,而Length(TotalByteArr)=80,80实际就是数组长度,可一个byte是1个字节,可为何Sizeof(TotalByteArr)=4呢?
发送数据时,生成的TotalByteArr中的十六进制串跟踪显示是正确的;
接收数据时,为了检测接收方接收是否正确,我又改成了:
var
RecLength:integer;
TotalByteArr:Array of byte;
Socketfile:TFileStream;
.........
Showmessage('step1');
RecLength:=Socket.ReceiveLength;

Showmessage('step2');
SetLength(TotalByteArr,RecLength);

Showmessage('step3');
Socket.ReceiveBuf(TotalByteArr,RecLength);

Showmessage('step4');
Memo2.Lines.Add(InttoStr(RecLength));

Showmessage('step5');
Socketfile:=TFileStream.create('c:/MySocket.dat',fmCreate);

Showmessage('step7');
Socketfile.Position:=0;
Socketfile.Size:=RecLength;

Showmessage('step8');
Socketfile.WriteBuffer(TotalByteArr,RecLength);

Showmessage('step9');
Socketfile.free;

Showmessage('step10');
freemem(TotalByteArr);
Showmessage('step11');
可在接收到数据后程序自动退出,但还是生成了数据文件,从文件中可以看出似乎接收的数据有问题!不知是何处有问题?但在Step4显示出的RecLength却是正确的,是80。
请各位高手帮帮忙吧!我先谢谢了!
 
不对吧?TotalByteArr是一个以Byte为单元的数组,每个单元只有1个字节长,如何可以容得下RecLength字节长的数据啊?
 
我用十六进制文件来保存结果,因为目的是为了测试接收是否正确。其它方法也可以考虑!
接收的数据串是不可以字符串显示,因为内含不可见字符。
 
TotalByteArr[0]相當於一個指針。
不是讀到這個單元。而是讀到以這個單元開始的連續字節中,共size個字節。

你把那些地方都改成這樣試試。
 
谢谢!改完后,倒是不会报错了,也不会退出了!
但我发送的buffer中,buffer[0]=$01的,结果在接收到后保存的dat文件中,结果似乎也不对,可发送时的buffer是检查正确的,为什么呢?
由于论坛似乎不可以发送附件,故lichdr等DX,可不可以告诉我Email address,我想发送接收到结果文件给您看,不知是否可以帮帮忙?谢谢了!
 
改后的:
RecLength:=Socket.ReceiveLength;
SetLength(TotalByteArr,RecLength);
Socket.ReceiveBuf(TotalByteArr[0],RecLength);
Memo2.Lines.Add(InttoStr(RecLength));
Socketfile:=TFileStream.create('c:/MySocket.dat',fmCreate);
Socketfile.WriteBuffer(TotalByteArr[0],RecLength);
Socketfile.free;
不过,还是有些疑问,请看:
http://www.swm.com.cn/yingyong/yy-00-08/yy12.htm
中就有以下部分程序:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
MyReceviceLength: integer;
S: string;
MyBmp: TBitmap;
MyJpg: TJpegimage;
begin
StatusBar1.SimpleText := '正在接收数据......';
if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象
接收}
begin
S := Socket.ReceiveText;
MySize := Strtoint(S); {设置需接收的字节数}
Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}
end
else
begin {以下为图象数据接收部分}
MyReceviceLength := socket.ReceiveLength; {读出包长度}
StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
begin
MyStream.Position := 0;
MyBmp := tbitmap.Create;
MyJpg := tjpegimage.Create;
try
MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
MyBmp.Assign(MyJpg); {将JPG转为BMP}
StatusBar1.SimpleText := '正在显示图像';
Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }
finally {以下为清除工作 }
MyBmp.free;
MyJpg.free;
Button2.Enabled := true;
{ Socket.SendText('cap');添加此句即可连续抓屏 }
MyStream.Clear;
MySize := 0;
end;
end;
end;
end;
为什么,在这截程序中却不是Mybuffer[0]?
 
那篇文章我也看到過了。我沒試過那個東西。不知道為什麼是這樣。

今天空一點。其實我也不是很懂的。是不是與socket的設置有關。
高人都沒出現
到這:lichdr@hotmail.com
 
请大家帮帮我!谢谢了!
 
动态数组跟静态的是有区别,这不是问题
 
to iie:
动态数组与静态数组除了长度之外有何区别?请指教。
to others:
我终于明白了,我最后测试出来,其实主要出错在数据的发送。
但还是要谢谢大家的帮助。
最激动人心的时候到了,散分啦!
 
是不是寫流的時候,出問題了。

動態數組開銷大一點。
而且是以0為基准的。
靜態數組下標可以自己定。
 
哈哈,不就是如您所说,数组头是一指针啊,发送时也是一样的,所以。。。
是您让我彻底的明白了。谢谢!
 
本來要在周未時候看看的(上班時運行一大段的程序不太好)
後來又有新的事情就拖了。也沒幫你看。你自己搞定就好了。
 
后退
顶部