IdTCPClient中memorystream 的接收问题!急+郁闷!一晚上没折腾出来!(indy9)

来源:http://topic.csdn.net/t/20041111/00/3541598.html

  

idTCPClient中memorystream 的接收问题!急+郁闷!一晚上没折腾出来!

  

  ms:   Tmemorystream;   

  
  Server端:  
  AThread.Connection.WriteStream(ms,true,true);  
   
  Client端:  
  IdTCPClient1.ReadStream(ms,   -1,   True);  
   
  为什么Client端停在这行就不动了   ?  
  我用wpe查看   数据已经过来了!  
   
  这里是不是必须判断MS的长度?  
  测试了几种参数都是阻塞到这就完了!搜索了一下也没找到答案!  
  那位给个例子     郁闷死了。。。。  


如果是没有断开的情况你在客户端read的,把第三个参数设置为true的话,第二个参数设置为你传输stream的大小。  
   
  可以这样修改:  
  Server端:  
  AThread.Connection.WriteInteger(ms.size);     //先发送大小;  
  AThread.Connection.WriteStream(ms,true,true);  
   
  Client端:  
  size   :=   IdTCPClient1.ReadInteger;   //先读取大小。  
  IdTCPClient1.ReadStream(ms,   size   ,   False);  


还有一个方法是,不发送大小,客户端读取buffer的大小,但是我没有试验成功。楼主可以试试。  
   
  Server端:  
  AThread.Connection.WriteStream(ms,true,true);  
   
  Client端:  
  size   :=   IdTCPClient1.InputBuffer.Size;   //先读取大小。  
  IdTCPClient1.ReadStream(ms,   size   ,   False);


在服务端发送完毕后,关掉连接,客户端的ReadStream就会返回(不然就会停在那里,一直等待读取,当然指定流的长度也是一样的道理)。


Server端:  
  AThread.Connection.OpenWriteBuffer;  
  AThread.Connection.WriteStream(ms,true,true);  
  AThread.FlushBuffer;  
  AThread.Connection.CloseWriteBuffer;  
   
  Client端:  
  IdTCPClient1.ReadStream(ms,   -1,   False);  
   
  酱紫……


如果是断开的情况,用   WGYKING(修罗是谁?!)   的方法可以,  
   
  不断开还是要先接收大小。


定义如下:  
  type  
      ARecord   =   packed   record  
          Command   :   Integer;  
          Content   :   String[30];  
      end;  
   
  var  
      CommBlock   :   ARecord;  
   
  服务端:  
  procedure   TForm1.IdTCPServer1Exception(AThread:   TIdPeerThread;  
      AException:   Exception);  
  var  
      ms   :   TMemoryStream;  
  begin  
      ms   :=   TMemoryStream.Create;  
      try  
          CommBlock.Command   :=   4003;  
          CommBlock.Content   :=   'Test   ReadStream';  
          ms.WriteBuffer(CommBlock,   sizeof(CommBlock));  
   
          AThread.Connection.WriteInteger(ms.Size);       //先发送大小  
          AThread.Connection.OpenWriteBuffer;  
          try  
              AThread.Connection.WriteStream(ms);  
              AThread.Connection.CloseWriteBuffer;  
          except  
              AThread.Connection.CancelWriteBuffer;  
          end;  
      finally  
          FreeAndNil(ms);  
      end;  
  end;  
   
  客户端:用timer控件读取,Interval=500,也可以用线程。  
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  var  
      ms   :   TMemoryStream;  
      size   :   Integer;  
  begin  
      if   not   IdTCPClient1.Connected   then   Exit;  
      ms   :=   TMemoryStream.Create;  
      try  
          size   :=   IdTCPClient1.ReadInteger;         //先读取大小。  
          if   size   =   0   then  
          begin  
              FreeAndNil(ms);  
              Exit;  
          end;  
          IdTCPClient1.ReadStream(ms,   size,   True);  
          ms.Position   :=   0;  
          ms.ReadBuffer(CommBlock,   sizeof(CommBlock));  
          RichEdit1.Lines.Add(IntToStr(CommBlock.Command));  
          RichEdit1.Lines.Add(CommBlock.Content);  
      finally  
          FreeAndNil(ms);  
      end;  
  end;  
   
  其它的设置你自己应该能够搞定,如果还不可以,留下mail我把这个例子发给你。

  

注意:  
   
  服务端:  
   
          ms.WriteBuffer(CommBlock,   sizeof(CommBlock));  
   
          //AThread.Connection.WriteInteger(ms.Size);       //先发送大小  
          AThread.Connection.OpenWriteBuffer;  
          try  
              AThread.Connection.WriteStream(ms,   True,   True);     //和上面的区别,如果这样,上面发送大小就不要了。  
              AThread.Connection.CloseWriteBuffer;  
          except  
              AThread.Connection.CancelWriteBuffer;  
          end;  
      finally  
          FreeAndNil(ms);  


搞成这才正常接收为什么?   IdTCPClient1.ReadStream(ms,   Size,   False);
原文地址:https://www.cnblogs.com/railgunman/p/1814099.html