用网络,如何发送和接收结构体? ( 积分: 30 )

  • 主题发起人 主题发起人 xiaohedou
  • 开始时间 开始时间
X

xiaohedou

Unregistered / Unconfirmed
GUEST, unregistred user!
用TClientSocket & TServerSocket发送和接收结构体:
type _InterPlay = record
csFileName:String;
iPlayingNo:Integer;
dwPosition:dword;
bInter:BooL;
end;
给出例子。
 
用TClientSocket & TServerSocket发送和接收结构体:
type _InterPlay = record
csFileName:String;
iPlayingNo:Integer;
dwPosition:dword;
bInter:BooL;
end;
给出例子。
 
//Send:
var
p :_InterPlay ;
begin
//初始p的值
ClientSocket1.Socket.SendBuf(p,sizeof(p));
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
p :_InterPlay ;
begin
socket.ReceiveBuf(p,sizeof(p));
//使用p 的值
end;
 
上面是一种方法。另外就是转换成stream,然后再将stream转换成struct
 
谢谢两位!:dcsdcs:能说一下如何转换成stream吗?
 
用Tserversocket发送后,到客户端csFileName:String;没有了!??sizeof(_InterPlay)
值.后来,我改为:csFileName:array [1..12] of char;就可以!
但两边都需要变换两次:string->array of char ; array of char -> string。很不方便!如何?
 
首先,你的 _InterPlay 定义有错
type _InterPlay = record
[red]csFileName:String;[/red] 错, 不能这样定义;
可以 csFileName:String[15];
iPlayingNo:Integer;
dwPosition:dword;
bInter:BooL;
end;


var
interay: __InterPlay
begin
inteay.???:=???
...
???.sendBuffer(inteay, sizeof(interay));
end

如果用stream, 反而是画蛇添足。
 
用Indy更容易搞定
 
楼主的结构定义没错,可以用流发送和接收。

看看我以前的回贴就可以找到答案。
 
字符串 -> 流:
procedure StreamWriteString(var Stream: TStream; Value: string);
var
Writer: TWriter;
begin
Writer:= TWriter.Create(Stream, 256);
Writer.WriteString(Value);
Writer.Free;
end;

流 -> 字符串:
function StreamReadString(var Stream: TStream): string;
var
Reader: TReader;
begin
Reader:= TReader.Create(Stream, 256);
Result:= Reader.ReadString;
Reader.Free;
end;

结构体 -> 流:
procedure StreamWriteStruct(var Stream: TStream; Struct: _InterPlay);
begin
with Struch do
begin
StreamWriteString(Stream, csFileName);
Stream.Write(iPlayingNo, SizeOf(Integer));
Stream.Write(dwPosition, SizeOf(DWord));
Stream.Write(bInter, SizeOf(Bool));
end;
end;

流 -> 结构体
procedure StreamReadStruct(var Stream: TStream; var Struct: _InterPlay);
begin
with Struct do
begin
csFileName:= StreamReadString(Stream);
Stream.Read(iPlayingNo, SizeOf(Integer));
Stream.Read(dwPosition, SizeOf(DWord));
Stream.Read(bInter, SizeOf(Bool));
end;
end;
 
晕倒,结构定义没有错?
 
不要以为结构体只能包括定长字段,它可以包括任何类型的变量
 
csFileName不能定义成String型,定义成string时,csFileName其实是个指针类型,
SizeOf(csFileName) = 4, 所以只能定义成shortstring型。

string[5]形式时自动成为shortstring型
 
是这样的,我的程序开始只是发送一个简单的字符串。我用Socket.SendText('str')。后来要发送的信息逐渐增加,我决定使用结构体发送和接收,按照ljl2004的方法进行改进后发现还是不太方便。非常感谢大家对这个问题的回答使我有了较多的认识。
xujunjie:感谢你提供的详细方法。但是:socket只有sendstream方法,没有Receivestream方法。还是要用socket.ReceiveBuf来读!
 
我如何为这个帖子加分啊?
 
xujunjie:
当然包括任何类型, 包括指针, 但你能操作吗? 你能取得指针的内容吗?

readBuffer 最简单
 
同意xujunjie的意见,readBuffer 最简单。谢谢各位!
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部