【问题标题】:TcpServer send string TcpClient (delphi)TcpServer 发送字符串 TcpClient (delphi)
【发布时间】:2014-05-27 23:28:16
【问题描述】:

如何接收消息组件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;

客户端不工作((

【问题讨论】:

  • 不起作用是不够具体的。以什么方式不起作用。你的调试告诉了你什么?
  • 程序运行良好。运行客户端(127.0.0.1、1488)运行服务器(127.0.0.1、1488)。点击打开光盘,没有任何反应
  • 你的调试告诉你什么?会发生交流吗?是否发送消息?是否收到消息?为什么调用mciSendString时不检查错误?
  • 这个概念在我看来很奇怪。应该是客户端向服务器发送内容,反之亦然。

标签: delphi tcpclient tcpserver


【解决方案1】:

TClientSocket 和其他套接字库实现不同,TTcpClient 中的OnReceive 事件不会在有新数据可供读取时触发。它仅在调用ReceiveBuf() 时触发(Receiveln() 在内部使用)。因此,在OnReceive 内部调用Receiveln() 是没有意义的,因为您必须首先进行读取操作才能触发OnReceiveBuf 参数提供已经读取的数据,将在OnReceive 退出时返回给调用者。所以OnReceive 更像是OnAfterRead 事件。要执行您正在尝试的操作,您需要定期调用Receiveln(),例如在计时器或循环中。没有事件告诉您何时阅读。

仅供参考,TTcpClient(和 TTcpServer 和其他相关类)has been removed 在 XE6 中。所以你最好使用TClientSocket 或来自 Indy、ICS、Synapse 等的第三方组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多