以前没有接触过网络编程,照着demo做了一个发觉传送简单字符串可以,但传送流确失败了。主要就是客户端发送请求,服务端收到请求后检索数据,然后传送回客户端处理。但是客户端收不到服务端发回的信息。
请大家指导,或者给出更好的方法。谢谢客户端:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  AStream: TStringStream;
begin
  server.Active := True;
  client1.Connect;
  if client1.Connected then
  begin
    AStream := TStringStream.Create('');
    bstream := TStringStream.Create('');
    try
      xml处理……      xml.SaveToStream(AStream);
      client1.OpenWriteBuffer;
      client1.WriteStream(AStream);
      client1.CloseWriteBuffer;      AStream.Size := 0;
      client1.ReadStream(AStream);    // 到这里就没有响应了
      AStream.Seek(0, soFromBeginning);
      xml.LoadFromStream(AStream);      xml处理……
    finally
      AStream.Free;
      client1.Disconnect;
    end;
  end;
end;procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
  sRequest: string;
  aStream: TStringStream;
  RootNode, InfoNode: IXMLNode;
  ParmNodes: IXMLNodeList;
begin
  with AThread.Connection do
  begin
    aStream := TStringStream.Create('');
    try
      ReadStream(aStream);
      AStream.Seek(0, soFromBeginning);
      xml.LoadFromStream(aStream);      xml处理……
      if sRequest = 'GET' then
      begin
        aStream.size := 0;
        GetInfo(InfoNode.ChildNodes, aStream);
        showmessage(astream.DataString);
        OpenWriteBuffer;
        WriteStream(aStream);
        CloseWriteBuffer;
      end;
    finally
      aStream.Free;
      disconnect;
    end;
  end;
end;

解决方案 »

  1.   

    转:我前一阵也遇到这个问题,通过看帮助终于弄明白了,其实是与WriteStream()和ReadStream()的参数有关,我简单说一下。WriteStream()有四个参数,第一个参数为数据流,第二个参数为boolean型,true代表从流的开始位置开始传输,而false代表从流的当前位置传输,默认为true。第三个参数也是boolean型,true代表标出传输的流的大小,而false为否。第四个参数为流的字节数大小。而ReadStream()有三个参数,第一个为数据流,第二个为数据大小,-1代表全部。第三个参数true表示只有在客户端disconnect后才能接到数据,而false表示客户端不必断开就可以接收到数据。你的问题就在这。可以有以下两种解决方法:
    1:
    客户端:
                 
    try
    begin
       OpenWriteBuffer;
       WriteStream(OutputStream);
       CloseWriteBuffer;
    finally
      disconnect;
    end;服务端:
      ReadStream(InputStream,-1,true);2:
    客户端:
       OpenWriteBuffer;
       WriteStream(OutputStream,true,true,outputstream.size);
       CloseWriteBuffer;服务端:
      ReadStream(InputStream,athread.connection.readinteger,false);
    其中athread.connection.readinteger存的是流的字节数大小。这样你就可参接到数据了。
      

  2.   

    不使用流,但是服务端收到信息后就断开了,并不向客户端发送信息。如何解决
    客户端
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: string;
      RootNode, InfoNode, ParmNode: IXMLNode;
    begin
      client1.Connect;
      if client1.Connected then
      begin
        try
          xml.Active := True;
          xml.ChildNodes.Clear;
          xml.Encoding := 'GB2312';
          RootNode := xml.AddChild('xml-root');
          InfoNode := RootNode.AddChild('type');
          InfoNode.Text := 'get';
          InfoNode := RootNode.AddChild('parameter');
          ParmNode := InfoNode.AddChild('xm');
          ParmNode.Text := Trim(edit1.Text);      client1.WriteLn(xml.XML.Text);      xml.LoadFromXML(client1.ReadLn);
          RootNode := xml.DocumentElement;
          ReadInfo(RootNode.ChildNodes);
        finally
          client1.Disconnect;
        end;
      end;
    end;
    服务端:
    procedure TForm1.ServerExecute(AThread: TIdPeerThread);
    var
      sRequest: string;
      sReponse: string;
      RootNode, InfoNode: IXMLNode;
      ParmNodes: IXMLNodeList;
    begin
      with AThread.Connection do
      begin
        try
          xml.LoadFromXML(ReadLn);
          RootNode := xml.DocumentElement;
          InfoNode := RootNode.ChildNodes['type'];
          sRequest := UpperCase(InfoNode.Text);
          InfoNode := RootNode.ChildNodes['parameter'];
          if sRequest = 'GET' then
          begin
            GetInfo(InfoNode.ChildNodes, sReponse);
            WriteLn(sReponse);
          end;
        finally
          disconnect;
        end;
      end;
    end;