我用socket.sendtext发送两条消息,如何socket.ReceiveText分开接收(100分)

  • 主题发起人 主题发起人 aiyuheyan
  • 开始时间 开始时间
A

aiyuheyan

Unregistered / Unconfirmed
GUEST, unregistred user!
我用socket.sendtext发送两条消息,如何socket.ReceiveText分开接收,
在线等待
 
不要连续发送.间隔时间.
 
如果想精确的话还是加个标志位比较好
 
我想过加标志位了,具体实现怎么实现.
就是发送 sendtext(i) 吗?
 
dongy_143
能说详细点吗?
 
const
chat = 'XXX';
//自己定义通讯协议 //c,s要是一样的。
socket发送消息时格式为: chat + 消息内容
socket接收消息时做判断:(用Copy,delete,pos这类函数分解就是了)
 
数据量大的话怎么处理?就是说每秒钟会有大量数据包过来,接收后解析会来不及解析完。。。
 
还有个好的办法:
发送:socket.sendtext(messsage1+char(10)+message2)
接收:
var
str: TStringlist;
begin
str := TStringlist.create;
str := sendtext.ReceiveText;
你的第一条消息:Str.Strings[0]
你的第二条消息:str.Strings[1]
str.free;
end;
 
数据量太大就用发送文件的方式好了。
 
str := sendtext.ReceiveText;
这句不对,运行是报错误
[Error] Unit1.pas(34): Incompatible types: 'TStringList' and 'String'
 

str := sendtext.receivetext 中的
str 错了吧,
应该是什么?
 
还没弄懂类,请在提示一下.
 
建议测试一下你的socket的发送强度和接收强度,获取具体测试数据后,才可以量身定制方案。
强度如下,每秒可发送接受的次数,每秒可发送的数据量;
对于频率处理,可以生成消息队列,排队处理。
对于数据量,可以采用固定分割,自定义分组,再不行大量数据就考虑切换新的独立端口。
 
你可以按这样的格式发送数据:
数据长度+数据
发送数据之前先发送数据的长度,之后再发送数据。
接收的时候则是先接收长度,之后再等待缓冲区的数据大于等于数据的长度的时候再一次性接收数据。
下面是示例代码:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
len: integer;
begin
s:= '0123456789';
len:= Length(s)+1;
//+1是因为要包括字符串后面的#0,如果是非文本数据,不用加1
ClientSocket1.Socket.SendBuf(len, Sizeof(Integer));
len:= ClientSocket1.Socket.SendBuf(S, len);
Memo1.Lines.Add('发送: '+IntToStr(len));
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i: integer;
s: string;
begin
{本代码只支持一个ClientSocket连接,如果需要处理多个连接,所以用一数组或者链表
保存 Socket句柄与之对应的状态 }
if (Tag= 0) then
//用Tag保存状态,0时表示未接收到当前数据包大小
begin
if (Socket.ReceiveLength>=Sizeof(Integer)) then
//缓冲区数据大于等于4时才读
//取数据包大小
begin
Socket.ReceiveBuf(i, Sizeof(Integer));
//SizeOf(Integer)为4
Tag:= i;
end;
end else
begin
//非0时,表示Tag是数据包的大小
if (Socket.ReceiveLength>= Tag) then
begin
{ 这里的操作可以写成一个函数,之后把数据传递给函数,这里为了简单起见,所以
没有这样做 }
SetLength(s, Tag);
Socket.ReceiveBuf(s, Tag);
Memo1.Lines.Add(s);
Tag:= 0;
//重置状态
end;
end;

end;
.
 
还有个好的办法:
发送:socket.sendtext(messsage1+char(10)+message2)
接收:
var
str: TStringlist;
begin
str := TStringlist.create;
str := sendtext.ReceiveText;/////这里应该是:str.text :=
你的第一条消息:Str.Strings[0]
你的第二条消息:str.Strings[1]
str.free;
end;

////对不起,
 
多人接受答案了。
 
后退
顶部