TClientSocket接收数组问题,在线等待,急盼回复 (66分)

  • 主题发起人 主题发起人 纯粹新手
  • 开始时间 开始时间

纯粹新手

Unregistered / Unconfirmed
GUEST, unregistred user!
(小弟初来乍到,没多少银两,区区66分不成敬意)。

小弟遇到一个问题,向大家请教:
我在服务器端用for循环向指定的客户端发送一个数组中的全部内容(一个名单数组)
___发送端__________
kkk:array[0..10] of String;
..........
for i:=0 to 9 do
Socket.SendText(kkk);

___接收端_________________

ss1:=Socekt.ReceiveText();
...............

这样写调试运行时没有问题,只是很多时候我发送了A,B之后,客户端接收到了AB,把两次发送的一次接收了。我想可能是服务器端用FOR循环发送速度太快,客户端来不及响应,把几次接收的合成一个了吧。
我查了一下有关文章,说是可以直接用SendBuf()发送一个数组到客户端。我想知道:
1:这样做可不可以?
2:如果可以发送---接受一个数组,那客户端用ReceiveBuf()接收后,如何知道接收到的是一个数组而不是字符串之类的?
3:假如客户端知道是一个数组,那么这个数组如何在客户端使用?是不是在客户端也需要定义这个数组?接收到的数组是不是可以直接赋值给一个相同类型的数组?比如:
bbb:array[0..10] of String;
........
bbb:=Socket.ReceiveBuf(***,***);
4: 另外,如果数组发送和接受可以解决,是不是发送一个记录型的也可以同样操作??
如:
type
client_record=record
CHandle: integer;
CName:string;
CAddress:string;
CUsed: boolean;
end;
.....
aaaaa:client_record;
这个可不可以把aaaaa作为SendBuf的参数传到客户端??发送和接受是否和发送接收数组类似???
谢谢!!!
(求有价值观点,给出可行代码更佳)
 
简单补充一下::
我在一个程序中,大多数时候是客户端和服务器端相互发送字符串,所以我用sendText()发送和接受。现在我又需要发送一个数组(结构)到客户端,那么onRead怎么办才好?是不是需要先发送一个消息告诉客户端,下一个要发送的是数组,然后客户端用ReciveBuf接收?还有,ReciveBuf(xxx,xxx)中接收长度如何确定?是否也需要事先将要接收的长度弄明白在接收?
而且,在有时候发送数组,有时候发送字符串的情况下,能保证两者都能正确被接收么?
 
我从来不用sendText(),只用SendBuf,接受也一样!只要自己设计好控制符,一样简单方便!
你的纪录有问题,不能用string类型,那是一个指针,你发给对方你自己机器内的指针毫无意义!!!
 
多谢masm,但是,如果用sendBuf不是很方便吧。
在一方用sendBuf(a,length(a))发送一个字符串,到了另一方用RecieveBuf(b,*)接收的时候不知道字符串长度,需要用自定义控制符来断句,这样在双方通信不是非常频繁的情况下有点大材小用了吧?用sendText()比较方便,只要发送频率不要太快,接收还是比较准确的。
我主要是想知道,在 发送/接收 一个数组(数组元素为字符串)或者结构(类型不定)时,有无比较好的方法?
仍然感谢masm
 
同意MASM,在数据包有固定格式和长度的情况下,用sendbuf比较好。而且不需要自定义控制符的,sendbuf是基于字节流的,无所谓开始与结束。
 
主要是发送和接收数组(结构体)的问题
 
可以是等接收方发出一个确认信息再发送。
 
不需要用for循环,你可以发送一个结构体,我举例说,要发送一个人的资料:
TMan=record
name:string;
age:byte;
other:array[0..888] of byte;
end;
发送:
WriteBuffer(man,sizeof(Man));
接收:
ReadBuffer(man,sizeof(Man2));
关键是双方定义一个完全一样的结构体就可以了。
 
将数组的内容处理过一次发送过去是最常用的方法:
kkk:array[0..10] of String;
str1:string;
..........
str1:='';
for i:=0 to 9 do
str1:=str1+ kkk+',';
Socket.SendText(kkk);
___接收端收到后通过对逗号‘,’进行分离处理_________________

ss1:=Socekt.ReceiveText();
我写过类似的程序,循环是很难实现的!

 
长度问题很好解决
1、包的长度控制在4K之内,我以前用1024,保险!嗬嗬
2、长度=...socket.revlengh//好像是,现在用indy了
delphiroad的方法就是最常用的方法,很管用!
 
请恕我驽钝
再请教一下delphiroad,
你说的发送一个结构体:
: 接收:
: ReadBuffer(man,sizeof(Man2));
(不知道是不是该把man改成man2?)
其中的man2大概是在接收端定义的结构体吧?就算是在发送端和接收端都用相同的语句定义了结构体man和man2,但是发送端的man是经过初始化的。也就是说,发送端的man是填充了数据的。而接收端的man2是空的,发送sizeOf(man)和接收sizeOf(man2)得到的大小是一样的么?能保证接收长度准确么?

敬请指教。

 
自己顶一下,迫切等待
 
自己顶一下,迫切等待
 
我也遇到这种问题.书上的实例好象Buffer是字符型数组,不是字符串.可否是字符串?
 
我用
var s:string;
begin
s:='123'
TcpClient1.Socket.SendBuf(s,3);
end;
服务器端用Socket.ReceiveText接收的时候成了乱码,怎么回事?
 
还有,用SendBuf连续发送的时候,接收时还是会合成一条,怎么办啊?
 
我刚才又试验了一下,发现使用delphiroad和masm两位同志的方法相结合可以实现发送、接受一个结构体(包括数组)
发送端:
kkk:array[0..2] of string;
数组元素赋值.......
self.ClientSocket.Socket.SendBuf(kkk,sizeOf(kkk));
接收端:
ssss:array[0..2] of string;
.......
Socket.ReceiveBuf(ssss,socket.ReceiveLength);

这个非常好!可以发送和接收一个数组。但是还有问题是,如果在发送端我接连发送了两次:
TestString:='asfddfs';
Socket.SendBuf(TestString,length(TestString)); //发送一个普通字符串
Socket.SendBuf(kkk,sizeOf(kkk)); //发送一个数组
那么在接收端,如何判断接收到的是一个字符串还是一个数组?接收端应该怎么写才能处理这种情况?
 
好象多次用SendBuf发送时,接收端只能接收到第一条,怎么回事?
 
我用SendBuf,服务器端不能正常接收,只有服务器和客户端做在同一个程序时,可以接收,但也只能接收第一条;做在不同程序时不能接收.怎么回事?
用SendText可以正常接收,但连续多次发送时,接收端把多条字符串合成一条.
到底怎么办啊?
 
数据在网络中传输,并没有字符串string一说。它是一串由脉冲电波表达的0和1,
0和1通过各种组合,就能表达字符串、或整数或数组等等。
sendBuf,Receive是发送和接收一段字节流。无所谓字符串或其它的什么东东。
它们也仅仅是由0和1组成的一段字节流。
换句话说,这些字节流,你要他表达什么,它就表达什么。
字符串、数组、记录,或者猫、狗或猴子s。。。

所以,关键在于你如何定义数据传输协议。
如,你需要定义字节流的包头,传输长度,每个字节代表的含义等等。
 
后退
顶部