代码部分如下:
服务器端:
server UNIT:
procedure TFrmTcpServer.ServerExecute(AThread: TIdPeerThread);
var
  CommBlock, NewCommBlock: TRecMsg;
  RecThread: TIdPeerThread;//线程池
  InputStream,ResStream:TStringStream;
  i: Integer;
  s,q:string;
begin
    if not AThread.Terminated and AThread.Connection.Connected then
    begin
         这里用读BUFFER的形式,然后返回给客户端没有问题
        // AThread.Connection.ReadBuffer(CommBlock,SizeOf(CommBlock));
        //NewCommBlock := CommBlock;
        //AThread.Connection.writebuffer(NewCommBlock, SizeOf(NewCommBlock), True);
         InputStream:=TStringStream.Create('');  以数据流的形式传
         AThread.Connection.ReadStream(InputStream,AThread.Connection.ReadInteger,false);
         s:=InputStream.DataString;
         memo1.Lines.Add(s);
         FreeAndNil(InputStream);
         q:='OK';
         ResStream:=TStringStream.Create(q);
         AThread.Connection.OpenWriteBuffer;
         AThread.Connection.WriteStream(ResStream);
         AThread.Connection.CloseWriteBuffer;
         FreeAndNil(ResStream);
    end;
end;
服务器端可以支持多线程的,只是我这里将代码简化了。服务器端程序应该没有问题,只是以数据流的格式通讯的时候,客户端收不到,不知道要触发哪个事件。客户端:
在客户端有个线程的定义如下:
TClientHandleThread = class(TThread)
                         private
                          CB: TSendMsg;
                          ResStream:TStringStream;
                          s:string;
                          procedure HandleInput;                         protected
                          procedure Execute; override;                        end;procedure TClientHandleThread.HandleInput;
begin
      s:=ResStream.DataString;
      FrmClient.IncomingMessages.Lines.Add ('返回值为:'+s);
      //FrmClient.IncomingMessages.Lines.Add ('返回值为:'+IntToStr(CB.sStateRet));
end;procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not FrmClient.Client.Connected then
      Terminate
    else
   try
       //FrmClient.Client.ReadBuffer(CB, SizeOf (CB));  
        以读BUFFER的形式读服务器端返回的数据,没有问题
        FrmClient.Client.ReadStream(ResStream,-1,false);
        读数据流的形式程序报错
        Synchronize(HandleInput);
   except
    end;
  end;
end;procedure TFrmClient.ButtonSendClick(Sender: TObject);
var
  NewSendMsg:TSendMsg;
  OutputStream:TStringStream;
  s:string;
begin
       {
        NewSendMsg.lHdSize:=SizeOf(TSendMsg);
        NewSendMsg.lTotalSize:=200;
        NewSendMsg.hxdId:=123456;
        NewSendMsg.sChannel:=1;
        NewSendMsg.sStateRet:=0;
        NewSendMsg.usFid:=10;
        NewSendMsg.szFName:='Test';
        NewSendMsg.nReserved1:=100;
        Client.WriteBuffer (NewSendMsg, SizeOf (NewSendMsg), true);
        这个是以写BUFFER的形式,没有问题,大家不用看,只是给大家一个参考。呵呵
        }
        s:='Test';
        OutputStream := TStringStream.Create(s);
        Client.OpenWriteBuffer;
        Client.WriteStream(OutputStream,true,true,outputstream.size);
        Client.CloseWriteBuffer;
        FreeAndNil(OutputStream);
        写数据流到服务器端没有问题,只是不知道客户端怎么读服务器端返回的值。
end;
另外说下,用BUFFER的形式,客户端是通过TClientHandleThread.Execute 过程来触发的。希望有人帮满解决下子,呵呵!