const
  TIMEOUT=60000;
type
  TRec=packed record //数据包格式
    cmd: integer;
    dat: array[0..100] of char;
  end;
var
  Stream: TWinSocketStream;
  rec: TRec;
begin
  if not tcp.Active then exit;
  Stream:=TWinSocketStream.Create(tcp.Socket,TIMEOUT);
  try
    rec.cmd:=1;
    Stream.Write(rec,SizeOf(rec));
    if Stream.WaitForData(TIMEOUT) then begin
      Stream.Read(rec,SizeOf(rec));
      memoClt.Lines.Add(format('收到返回:[命令号=%1d,数据=%1s]',[rec.cmd,rec.dat]));
    end;
  finally
    Stream.Free;
  end;

解决方案 »

  1.   

    delphi帮助中多线程socket中有一个例子,可以参考一下
      

  2.   

    unit MainU;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls;const  timeout=60000;type  Trec = packed record
        cmd: integer;
        dat: array[0..99] of char;
      end;  TForm1 = class(TForm)
        Memo1: TMemo;
        ServerSocket1: TServerSocket;
        procedure FormCreate(Sender: TObject);
        procedure ServerSocket1GetThread(Sender: TObject;
          ClientSocket: TServerClientWinSocket;
          var SocketThread: TServerClientThread);
      private
        { Private declarations }
      public
        { Public declarations }
        mstr: string;
        procedure display;
      end;
        TMyThread = class(TserverClientThread)
        public
         rec: Trec;
         skt: Tclientsocket;
         constructor create(createsuspended: boolean;Asocket: TserverClientwinsocket;ip: string;port: integer);
         destructor  destroy; override;
         procedure  Clientexecute; override;
       end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      with  ServerSocket1 do
      begin
        Port:=888;
        ServerSocket1.ServerType:=stThreadBlocking;
        open;
      end;
    end;
    procedure TMyThread.Clientexecute;
    var stream: Twinsocketstream;
       s: string;begin
      inherited;
     while (not terminated) and Clientsocket.Connected do
     begin
       Stream:=TwinsocketStream.Create(Clientsocket, timeout);
       fillchar(rec,sizeof(rec),0);
       if Stream.WaitForData(timeout)  then  begin
          stream.Read(rec,sizeof(rec));
       Stream.Write(rec,sizeof(rec));
       end;
       stream.Free;
     end;
    end;
    procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    begin
      SocketThread:=TMyThread.create(false,Clientsocket,'192.168.0.77',888);
    end;constructor TMyThread.create(createsuspended: boolean;
      Asocket: TserverClientwinsocket; ip: string; port: integer);
    var Stream: TwinsocketStream;
    begin      inherited Create(createsuspended,asocket);
      FreeonTerminate:=True;
    end;