ServerSocket-ClientSocket发送自定义结构数据的例子有吗???80分(80分)

  • 主题发起人 主题发起人 jgame
  • 开始时间 开始时间
J

jgame

Unregistered / Unconfirmed
GUEST, unregistred user!
ServerSocket/ClientSocket发送自定义结构数据的例子有吗???
不知道怎么写..
如含一个流 一个字符串这样.
 
1。其实还是使用字符最好,
如果是使用SendText'的话,
主要是如何计算字符占有的字符的长度。或者空间
2。可以使用发送流,可以使用文件流。
 
我现在要发
一个文件+10个参数

这样..
根据参数来判断是什么东东这样..再处理..
.send一次

有什么好办法吗???
 
1。第一个办法。
先发文件。文件发送完毕后,服务器相应一个接受完毕。最后客户端根据完毕请求发送参数。最好的办法是使用字符长度定位。但是也可以使用特殊字符定位。
比如#Command|param1@param2@param3@param3@param3.!
之后进行分解
2。第二个办法。
我感觉,另外使用INDY或者FASTNET组件,如果接收到command的话,开始开启FASTNET的组件进行接受文件。
也可以使用SCOKET接收。我就不知道了。知道告诉我。
 
一次的话,我感觉应该对发送的文件进行修改文件格式。
 
我记得有这样的方案
ServerSocket/ClientSocket发送自定义结构数据的

不知道.有没有人会...
 
先发参数在传文件;
如果用结构如:
type
//数据类型 字符串  下载文件 上传文件 记录
TDataType = (dtString, dtGetFile, dtUpFile, dtRecord);

//发送数据记录
TSendData = packed record //记大小4096
FDataType: TDataType; // 数据类型
FSockFlage: Integer; // Server/Client Flage
FDataSize: Integer; // 数据大小
FDataAllLength: Integer; //数据总长度
FCmdStr: array[1..255] of Char;// COMMAND string
FData: array[1..1024] of Char;// 数据
end;
在接收时用结构收就行
根据数据大小和总长度确定文件是否接收完成.
procedure OnWrite(Hwnd: HWND; var S: TSocket);
var
SendBuf: TSendData;
lpText: PChar;
//Buf: array[0..1024] of Char;
begin
if S <> INVALID_SOCKET then
begin

//填充SendBuf
FillChar(SendBuf, SizeOf(SendBuf), 0);
//取得Command str
XWinSock.GetWndText(hCmdEdt, lpText);
//填充SendBuf.CmdStr
lstrcpy(SendBuf.CmdStr, lpText);
//删除lpText
FreeMem(lpText);
//服务标识
SendBuf.FSockFlage := SF_CLIENT;

//数据类型
SendBuf.FDataType := TDataType(SendMessage(hCmdList, CB_GETCURSEL, 0, 0));
if SendBuf.FDataType = dtUpFile then
begin
SendFile(S, SendBuf);
end else begin
WinSock.send(S, SendBuf, SizeOf(SendBuf), 0);
end;


procedure OnRead(Hwnd: HWND; var S: TSocket);
var
ReadBuf: TSendData;
Len: Integer;
begin
if S <> INVALID_SOCKET then
begin
FillChar(ReadBuf, SizeOf(ReadBuf), 0);
Len := WinSock.recv(S, ReadBuf, SizeOf(ReadBuf), 0);
if Len > 0 then begin
case ReadBuf.FDataType of
dtString: ReadString(S, ReadBuf);
dtUpFile:;
dtGetFile: ReadFileBuffer(S, ReadBuf);
dtRecord:;
end;
//OnWrite(Hwnd, S, ReadData);
end
else begin
ReadBuf.FDataType := dtString;
ReadBuf.FSockFlage := SF_SERVER;
ReadBuf.CmdStr := '读取数为空!';
FormatChar(StatusText, 'Server Host: [%s], ReadBuf.CmdStr: [%s]',
[Integer(GetRemoteHost(S)), Integer(@ReadBuf.CmdStr)]);
MemoAdd(hMemo, StatusText);
end;
end;
 
注意,有时结构被截断,要特别处理。
 
多人接受答案了。
 

Similar threads

回复
0
查看
864
不得闲
回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部