这是server端接收数据的代码,接收没问题,我想在接收后立刻发送一个返回数据.
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  str:string;
begin
  str:='';
  while (NOT AThread.Terminated) and (AThread.Connection.Connected)
    and ( str='') do
    str:=AThread.Connection.ReadLn;
    MeMo1.Lines.Add(TimeToStr(Time)+str);
    str:='dddd';
    Athread.Connection.WriteLn(str);    //发送?
end;在client端的onwork事件中接收对么?还是代码有错?
procedure TForm1.IdTCPClient1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var
  str:string;
begin
  str:='';
  while str='' do
    begin
      str:=IdTcpClient1.ReadLn;
    end;
  showmessage(str);
end;

解决方案 »

  1.   

    server端没什么问题
    client端先发,IdTcpClient1.writeLn;下条语句接着收IdTcpClient1.readLn
      

  2.   

    谢谢,我把readln加在writeln后果然可以收到了。
    但我的writeln是在client发送的函数下,那不是如果server主动发送不就没法收了?
    请问client端收到数据时能触发哪个函数么?
      

  3.   

    放在线程里去接收。            IdClient.Connect(10000);
                ClientThread := TClientMessageThread.Create();
                ClientThread.FreeOnTerminate := True;
                ClientThread.Resume;
    while not Terminated do
            begin
                if not Fm_Main_Client.IdClient.Connected then
                    Terminate
                else
                try
                    MsgCommand := Fm_Main_Client.IdClient.ReadLn();
                    ServerMsg := MsgCommand;
                    if StrToInt(Trim(Copy(MsgCommand, 1, 2))) = 99 then
                    begin
                        Fm_Main_Client.IdClient.Disconnect;
                        Synchronize(HandleMessage);
                        Terminate;
                        Exit;
                    end
                    else
                        Synchronize(HandleMessage);
                except
                end;
            end;
      

  4.   

    二楼的大哥(getit911(Windows转Linux中))好
    客户端先发是什么理由呢,能解释下吗?
      

  5.   

    C/S结构中,通常都是由Client先发起连接,TCP/IP连接建立后数据传输可以是双向的,但通常都是由Client发出请求Server进行应答。
      

  6.   

    看看indy的demo或找找以前的帖子