我用 TServerSocket,TClientSocket (D7)来发送与接收信息,
希望功能是:每次发送信息前 ClientSocket.open, SendText 后 ClientSocket.Close;
可奇怪的是:程序启动后的第一次发送总不能成功,之后的每次发送都能成功
。不知道为什么。服务器端(stNonBlocking;Port := 3369):OnClientRead 事件
procedure TfrmMonitor.srvMonitorClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Len:integer;
  MfromClient,: string;
begin
  MfromClient := Socket.ReceiveText;
  Beep;
end;//Client 端 
procedure TfrmClient.btnMtoSendClick(Sender: TObject); //发送信息按钮
var
  MtoSend: string;
begin  cltMtoSend.Address := '192.168.0.222';
  cltMtoSend.Port := 3369;
  cltMtoSend.Open;  MToSend := 'Test! Test!';
  cltMtoSend.Socket.SendText(MtoSend);  cltMtoSend.Close;
end;

解决方案 »

  1.   

    并且这试过:
    var
      m: integer
      MtoSend: string;
    begin  cltMtoSend.Address := '192.168.0.222';
      cltMtoSend.Port := 3369;
      cltMtoSend.Open;  m := 0;
      while m = 0 do
        Delay(1000); //自定义延时函数
        MToSend := 'Test! Test!';
        m := cltMtoSend.Socket.SendText(MtoSend);
        Memo1.Lines.Add('返回代码:' + IntToStr(m));
      end;
      cltMtoSend.Close;
    end;
    返回代码一直是零,但如果之前已经联接并断开过一次就正常.
      

  2.   

    MToSend := 'Test! Test!';
      cltMtoSend.Socket.SendText(MtoSend);放在OnConnect事件里发送。
      

  3.   

    改变clienttype=ctBlocking就可以解决了