高手们,    为什么我在IDTCPClient/IDTCPServer控件中以内存流的方式传送一个数据时总是接收时出现错误,而我用同样的方法用在IDUDPClient/IDUDPServer控件上却不会报错,传输都是正确的!!有哪位老大有IDTCPClient/IDTCPServer以内存流传输数据的实例麻烦给一个好吗?谢谢了!
E_Mail: [email protected]
        [email protected]

解决方案 »

  1.   

    indy里面没有关于IDTCPClient/IDTCPServer控件中以内存流的方式传输数据的实例!
      

  2.   

    WriteBuffer(AStream.Memory^, AStream.Size)
      

  3.   

    好像控件本身有这方法
    发送:
    IdTCPClient1.OpenWriteBuffer;
    IdTCPClient1.WriteStream(AStream);
    IdTCPClient1.CloseWriteBuffer;接收:
    ReadStream...
      

  4.   

    给你一点建议,通过网络传输的数据包有大小限制,太大了容易出错,太小了有浪费报文,所以,很多人都使用4KB作为一个包的大小,你可以在发送数据之前,把他们手工分割成每个4KB的段,然后发送。接受端再组装。
      

  5.   

    是这样的,本来呢发送是发送出去了,可是我如果在报文中定议了一个字符形或是整型数据发送过去接收时总是不对!但用另一种方法却是对的!错误的:
    -----------------------发送代码--------------------------------
    var
      SendStr: String;
      AStream := TMemoryStream;
    begin
      SendStr := 'asdfasdf';
      AStream := TMemoryStream.Create;
      AStream.Clear;
      AStream.Write(SendStr,SizeOf(SendStr));
      IdTCPClient1.OpenWriteBuffer;
      IdTCPClient1.WriteStream(AStream);
      IdTCPClient1.CloseWriteBuffer;
    ---------------------------------------------------------------
    ------------------------接收代码------------------------------
    var
      SendStr: String;
      AStream := TMemoryStream;
    begin
      AStream := TMemoryStream.Create;
      AStream.Clear;
      TCPServer.AThread.Connect.ReadStream(AStream,-1,True);
      AStream.Read(SendStr,Sizeof(SendStr);
    --------------------------------------------------------  
    接收的时候是‘’空字符!正确的:var
      SendStr: String[255]; <---------这里只需要修改成这样就一点错没有了!
    begin
      SendStr := 'asdfasdf';
      AStream := TMemoryStream.Create;
      AStream.Clear;
      AStream.Write(SendStr,SizeOf(SendStr));
      IdTCPClient1.OpenWriteBuffer;
      IdTCPClient1.WriteStream(AStream);
      IdTCPClient1.CloseWriteBuffer;
    这个时候就完全正确了,但只能发送255个字符!!各位大侠,这到底是怎么回事呀???
      
      

  6.   

    AStream.Write(SendStr,SizeOf(SendStr));改成
    AStream.Write(SendStr, Length(SendStr);试试
      

  7.   

    当SendStr类型为string时候,
    AStream.Write(SendStr, Length(SendStr);错了..
    应该写成
    AStream.Write(pchar(SendStr)^, Length(SendStr);最好跟一句
    AStream.Position:=0;
      

  8.   

    对了,哈欠兄说得:
    AStream.Write(PChar(SendStr)^, Length(SendStr);
      

  9.   

    怎么在idTCPServer的onExecute事件中不能执行 
    AThread.connection.ReadStream(str,-1,True)
      

  10.   

    怎么在idTCPServer的onExecute事件中不能执行 
    var
      Str: TMemoryStream;
    begin
      Str := TMemoryStream.Create;
      Str.Clear;
      AThread.connection.ReadStream(str,-1,True) <--每到这一句就挂起不往下执行了!!!!
      

  11.   

    楼主其实按下F1,很多东西就可以省着不问了。。
    AThread.connection.ReadStream(str,-1,True)
    第三个参数名字叫AReadUntilDisconnect.......
    仅看这变量名字应该可以明白很多,
    除非对方断开连接,则表示数据没有读完,要等待一直读下去。