如何收到邮件组件TcpSlient?
客户端:
procedure TForm1.client1Receive(Sender: TObject; Buf: PAnsiChar;
var DataLen: Integer);
var
s: string;
begin
s := client1.Receiveln();
while s<>'' do begin
if s='CDOPEN' then
mciSendString('Set cdaudio door open wait', nil, 0, handle);
if s='CDCLOSE' then
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
s := client1.Receiveln;
end;
end;
服务器
procedure TForm1.Button2Click(Sender: TObject);
var
st: AnsiString;
begin
st:='CDOPEN';
TcpServer1.Sendln(st);
end;
客户端不起作用((
答案 0 :(得分:3)
与TClientSocket
和其他套接字库实现不同,OnReceive
中的TTcpClient
事件在有新数据可供读取时不会触发。它仅在调用ReceiveBuf()
时触发(Receiveln()
在内部使用)。因此,在Receiveln()
内调用OnReceive
是没有意义的,因为您必须在阅读操作中首先触发OnReceive
。 Buf
参数提供已经读取的数据,并在OnReceive
退出时返回给调用者。因此,OnReceive
更像是OnAfterRead
事件。要执行您尝试的操作,您需要定期调用Receiveln()
,例如在计时器或循环中。没有事件要告诉你何时阅读。
在XE6中,仅供参考,TTcpClient
(以及TTcpServer
和其他相关类别)has been removed。因此,最好使用来自Indy,ICS,Synapse等的TClientSocket
或第三方组件。