麻烦帮我看看代码,关于流与socket传输的。(100分)

  • 主题发起人 zzutlink
  • 开始时间
Z

zzutlink

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端:
procedure TForm1.Button2Click(Sender: TObject);
var
fs:TFileStream;
buff:array[1..1024] of byte;
ss:TStringStream;
tempStr:string;
tempInt:Longint;
len:array[1..4] of byte;
begin
ss := TStringStream.Create('') ;
tempStr := Edit1.Text ;
fs := TFileStream.Create(tempStr,fmOpenRead) ;
tempInt := fs.Size ;
Label1.Caption := IntToStr(tempInt) ;
ss.Seek(0,0) ;
ss.WriteString(tempStr+#0) ;
len[1] := tempInt div 256 div 256 div 256 ;
len[2] := (tempInt - len[1]*256*256*256) div 256 div 256 ;
len[3] := (tempInt - len[1]*256*256*256 - len[2]*256*256) div 256 ;
len[4] := tempInt - len[1]*256*256*256 - len[2]*256*256 - len[3]*256 ;
ss.Seek(180,0) ;
ss.WriteBuffer(len,4) ; //我想将181至184用来记录文件大小
ss.Seek(0,0) ;
ss.Read(buff,SizeOf(buff)) ;
TcpClient1.RemoteHost := '198.168.166.218' ;
TcpClient1.RemotePort := '5000' ;
TcpClient1.Connect ;
TcpClient1.SendBuf(buff,SizeOf(buff)) ;
TcpClient1.Disconnect ;
fs.Free ;
ss.Free ;
end;

服务器端:
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
buff:array[1..1024] of byte;
ms:TStringStream;
tempStr:string;
tempInt:Longint;
len:array[1..4] of byte;
begin
ClientSocket.ReceiveBuf(buff,SizeOf(buff)) ;
ms := TStringStream.Create('') ;
ms.Write(buff,SizeOf(buff)) ;
ms.Seek(0,0) ;
tempStr := ms.ReadString(180) ;
ms.Seek(180,0) ; //定位到第180
Edit1.Text := tempStr ;
ms.ReadBuffer(len,4) ; //读取长度信息,但结果是错误的。
tempInt := len[1]*256*256*256 + len[2]*256*256 + len[3]*256 +len[4] ;
Label1.Caption := IntToStr(tempInt) ;
ms.Free ;
end;

请问哪儿错了?谢谢各位!
 
dfw现在人气不够旺啊!
 
我没仔细看。首先你要看一下在Server端收到的数据是否正确,
即在ClientSocket.ReceiveBuf(buff,SizeOf(buff)) ;一句后看一下buff中的内容是否是你想要
的内容。
 
我看了,前半截子是对的
后面的是错的,文件大小那部分是错的,其他是对的
 
var
s: string;
b: array[1..1024]of byte;
len: DWORD;
begin
s := '1234567890';
FillChar(b,sizeof(b),0);
len := length(s);
CopyMemory(@b[1],@s[1],len+1);
b[181] := len shr 24;
b[182] := (len - (b[181] shl 24)) shr 16 ;
b[183] := (len - (b[181] shl 24) - (b[182]shl 16)) shr 8 ;
b[184] := len - (b[181]shr 24) - (b[182]shr 16) - (b[183] shr 8) ;
...SendBuf(b,...);
end;
 
啊,解决了啊
zw84611指出的问题是正确的,谢谢啊

不过我是用另外一种方法解决的,就是在写入大小信息的时候ss.size := 184 ;
 
顶部