如何在socket编程中传输多维可变数组!!! (高分求助)(200分)

  • 主题发起人 主题发起人 wzs
  • 开始时间 开始时间
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!

一维数组处理:
var
LData : OleVariant;
p :Pointer;
LDataPacket : array[0..? - 1] of Byte;
begin
LData :=ClientDataSet1.Data;
P := VarArrayLock(LData);
Move(P^,LDataPacket,ClientDataSet1.DataSize);
VarArrayUnlock(LData);
if ClientSocket1.Socket.SendBuf(LDataPacet,SizeOf(LDataPacket)) > 0 then
...;
end;
二维多维数组: ???????
var
LData:Olevariant;
begin
LData := VarArrayCreate([0,2],VarVariant);
LData[0] := '1111111111111';
LData[1] := 2;
LData[2] := LClientData1.Data;
.....
该怎么编写 . 求通用写法
1: 关键点 DataSize ,(判断类型求大小?!)
2: OleVariant的存储方式
2: DCom中有接口可传,没时间研究,希望有经验的高人指点,不胜感激!!
 
我知道我在的公司的程序员就是按你说的那种方法做的(一个短讯群发软件),具体怎么样,不知道哦。哈哈哈
我也想看看。
等我找找,看有没有源代码。哈哈哈

不好意思,菜鸟乱发言哦!看着你分来的[:D]
MSN:TonsonJ@hotmail.com
 
//服务器端接口函数
//此函数你需在服务器端定义一个remote data module;在 .tlb里面新增。然后在刷新
//再在定义好的函数下写代码,如
function Tnewtest.Gettest: OleVariant;
var
strtest : string;
begin
query1.Active:=false;
query1.SQL.Clear;
query1.SQL.Text:='select UserId from UserManage';
query1.Open;
query1.First;
strtest := query1.Fields[0].AsString;//从数据库中取数据传客户端
Result := VarArrayCreate([0, 1], varVariant);
Result[0]:=strtest;
result[1]:=6;
//自定义数据传客户端
end;
客户端:
procedure TForm1.Button3Click(Sender: TObject);
var
r : variant;
begin
r :=socketconnection1.AppServer.gettest;
//如用dcom则为
// r :=dcom1.AppServer.gettest;
edit1.Text:=r[0];
edit2.Text:=inttostr(r[1]);
end;
r[0],r[1]即为从服务器端所传的参数。
二维数组类似,在VarArrayCreate定义即可。
至于定义大小,建议用客户端的clientdataset控件的packetrecords属性来操作。
 
肯定是要自己处理的
把多维数组转成字节流然后发过去再还原。
至于怎么转换你可以自己想办法,比如分两条消息,一是控制,一是内容
控制流中描述的是你的数组信息,如维数,每一维的长度等等。 然后用这些信息来解析
收到的内容流。
 
如果知道每一元素的具体含意就没必要这样发送了.
需求的是未知多维数组的传输,这样才能保证系统的灵活性,模块的独立性. 接收方与发送方只需按自己的定义设计接口.
 
多维数组其实也是一维数租,稍微处理一下就可以当一维数租发送了。用variant垃圾数据
不少,不太合理。
 
无忌兄,给个解法! 给你介绍个 'zoumin'
 
var
buf:array[0..4,0..123]of char;
pbuf:pchar;
iSize:Integer;
pbuf:=@buf;
然后循环发送就OK了
ClientSocket.socket.sendbuffer(pbuf^,iSize);
 
一定要解包,一个一个的分析,一个一个的发送,然后接收一个一个的拼凑....
分析它的长度,然后....麻烦!!!!#!#@#@#
求一个包发送.... + 包长度 ...
 
TCP编程就是这么麻烦,可以锻炼对指针的操作能力哦[:D]
 
来人呀[:)][:D][8D][:(][:(!][^][?]
 
不需要知道每个元素的含义,但要知道每个元素的大小吧
比如你 array of array of string与 array of array of variant与 array of array of byte
那是差很远的,应该很难通用处理
 
其实Socket编程中传输都是流式传输,
所以你最好在定义两个函数!
一个打包(打成流)
一个解包(还原)
 
自己定义协议
 
应该在前面几个字节定义一下后面的格式信息,比如说0表示字串,1 表示byte,2表示short int 等。然后最好对每个元素按定长格式来发送。对字符串,可以自定义一个串结束符(比如说#0)。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
746
SUNSTONE的Delphi笔记
S
后退
顶部