我用delphi写了1个TTcpServer; 
在有请求的时候将ClientSocket保存起来。稍后再处理;代码如下:procedure TSocketService.TcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
   begin
           showmessage( ClientSocket.RemoteHost + '' + ClientSocket.RemotePort);  //打印出来IP跟端口。
           pondThread.addThread(ClientSocket);  //将ClientSocket对象添加到1个线程中。
   end;
线程代码:type
TSocketThread = class(TThread)
   procedure Execute; override;
   ClientSocket : TCustomIpClient;procedure TSocketThread.Execute;
begin
      showMessage(ClientSocket.RemoteHost + '' + ClientSocket.RemotePort); //这里会报错.
end;在TcpServerAccept方法跟客户端通信是没有问题的。 但是将ClientSocket对象传递到其它对象后再进行通信就不行了。
想不通,请高手指教呀。

解决方案 »

  1.   

    把aClientSocket 作为线程的一个属性FClientSocket 
    然后
    thread.create(true)//先挂起
    thread.aClientSocket =ClientSocket;
    thread.Suspended := false;
      

  2.   

     我是这么做的。
     pondThread.addThread(ClientSocket);   这句就是讲ClientSocket 赋值给线程对象当属性。
     问题是这么做它不能进行通信。 通信会报错哦。
      

  3.   

    异常信息:
    delphi Access violation at address 00000000. Read of address 00000000;
    function TPondThread.addThread(cs :TCustomIpClient):Boolean;
    var
       socketThread :  TSocketThread;
    begin
                socketThread :=  TSocketThread.Create(true);
                socketThread.setSocket(cs);
                showMessage(cs.RemoteHost + '' + cs.RemotePort); //这句正常
                showMessage(socketThread.ClientSocket.RemoteHost + '' + socketThread.ClientSocket.RemotePort); //异常了
                socketThread.Resume;
                Result := true;
    end;
      

  4.   

    很明显对象被删除了
    你用=的方式对对象进行赋值其实只是引用了一个地址而已
    你用assign试试看thread.create(true)//先挂起
    thread.aClientSocket.assign(ClientSocket);
    thread.Suspended := false;
      

  5.   

    还是不行。 错误是 : Cannot assign a TCustomIPClient to a TCustomIpClient
      

  6.   

    Procedure TFileServerThread.ClientExecute;
    Var
      Data: Array[0..1023] Of char;
      RecText: String;
      SocketStream: TWinSocketStream;
    Begin
      While Not Terminated And ClientSocket.Connected Do
      Try
        SocketStream := TWinSocketStream.Create(ClientSocket, 10000);
        Try
          FillChar(Data, SizeOf(Data), 0);
          If SocketStream.Read(Data, SizeOf(Data)) = 0 Then
          Begin
            // If we didn't get any data after xx seconds then close the connection
            ClientSocket.SendText('Timeout on Server'+#13#10);
            //Wait a little time to allow sending of text before disconnect
            sleep(1);
            ClientSocket.Close;
            Terminate;
          End;
          RecText := Data;
          If Length(RecText) > 2 Then
            Delete(RecText, Pos(#13#10, RecText), 2); // Delete #13#10
          If ClientSocket.Connected Then
          Begin
            ClientSocket.SendText(RecText);
            SendMessage(Form1.Listbox1.Handle, LB_ADDSTRING, 0, Integer(PChar(RecText)));
            PostMessage(Form1.Handle, CM_INCCOUNT, 0, 0);
          End;
        Finally
          SocketStream.Free;
        End;
      Except
        HandleException;
      End;
    End;
      

  7.   

    pondThread.addThread 代码怎么写的?