当前位置:主页>仓库管理软件> 列表

ServerSocket-ClientSocket发送自定 找进销存软件下载

仓库管理软件版1楼: ServerSocket/ClientSocket发送自定义结构数据的例子有吗???
不知道怎么写..
如含一个流 一个字符串这样.

2楼: 1。其实还是使用字符最好,
如果是使用SendText''的话,
主要是如何计算字符占有的字符的长度。或者空间
2。可以使用发送流,可以使用文件流。 如进销存软件下载

3楼: 我现在要发
一个文件+10个参数

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

有什么好办法吗???

4楼: 1。第一个办法。
先发文件。文件发送完毕后,服务器相应一个接受完毕。最后客户端根据完毕请求发送参数。最好的办法是使用字符长度定位。但是也可以使用特殊字符定位。
比如#Command|param1@param2@param3@param3@param3.!
之后进行分解
2。第二个办法。
我感觉,另外使用INDY或者FASTNET组件,如果接收到command的话,开始开启FASTNET的组件进行接受文件。
也可以使用SCOKET接收。我就不知道了。知道告诉我。

5楼: 一次的话,我感觉应该对发送的文件进行修改文件格式。

6楼: 我记得有这样的方案


ServerSocket/ClientSocket发送自定义结构数据的

不知道.有没有人会...

仓库管理软件版7楼: 先发参数在传文件;
如果用结构如:
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;

8楼: 注意,有时结构被截断,要特别处理。

9楼: 多人接受答案了。