大家好!我用Delphi 6的TServerSocket和TClientSocket做一个简单的通信工具,但一开始就遇到问题。代码如下://----Code of server side----
procedure TServerForm.FormCreate(Sender: TObject);
begin
  with ServerSocket1 do
  begin
    Close;
    Port := 49536;
    ServerType := stNonBlocking;
    Open;
  end;
end;procedure TServerForm.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Memo1.Lines.Add('Error occurs: ' + IntToStr(ErrorCode));
  ErrorCode := 0;
end;procedure TServerForm.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Connected');
end;procedure TServerForm.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Disconnected');
end;procedure TServerForm.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Reading from socket...');
  Memo1.Lines.Add(Socket.ReceiveText);
end;//----Code of client side----
procedure TClientForm.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Memo1.Lines.Add('Error occurs: ' + IntToStr(ErrorCode));
  ErrorCode := 0;
end;procedure TClientForm.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Connected');
end;procedure TClientForm.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Disconnected');
end;procedure TClientForm.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Writing to socket...');
end;procedure TClientForm.btnSendClick(Sender: TObject);
begin
  with ClientSocket1 do
  begin
    if not Active then
    begin
      Address := '127.0.0.1';
      Port := 49536;
      Open;
    end;
    Socket.SendText('Shaking hands...');
  end;
end;我在客户端点击btnSend按钮,服务器上显示“Connected”,表明它的OnClientConnect事件已经触发,连接成功;但期望中的“'Reading from socket...”字样就没显示出来,使用Delphi调试也发现OnClientRead事件并没有触发。这是怎么回事呢?请指教

解决方案 »

  1.   

    另外我编译了Delphi自带的Chat例子,能正常工作。我对比了我的程序和例子,没有发现两者有什么特别的区别,这让我很迷惑
      

  2.   

    正常呀~,我编译你的代码没发现问题呀
    btnSendClick点第一次的时候Socket.SendText('Shaking hands...');没有触发
    因为active=false
    再点一下就ok了
      

  3.   

    to Devillyd(ξ赤 影ξ):
    你测试时能在服务器端看到“Reading from socket...”字样么?奇怪了我这里看不到,反复测试都这样。有些什么可能会导致这个问题呢?
      

  4.   

    问题已解决。以下是在Borland的论坛上得到的答复:You are sending your data to the server too soon.  When used in non-blocking mode, TClientSocket::Open() is does not block until the socket is connected. It returns immediately after beginning the asynchronous process of connecting to the server.  So you are sending the data before the socket has actually connected.  You need to wait for the OnConnect event to trigger before then sending your data.Gambit