服务器端的代码:
在IdTCPServer1的OnExcute事件中
             MyMemStream := TMemoryStream.Create;
             try
               AThread.connection.ReadStream(MyMemStream,-1,false);
               ....
               ....
             finally
               MyMemStream .free;
             end;遇到的问题是:
    每次客户端一连接,代码如下:
       IdTCPClient1.Connect(10000);
   服务器端的代码就停留在readstream(streamimg,-1,false);这里,关闭客户端程序后,服务器端报错,并跳到finally 里执行MyMemStream .free;请问如何解决呢?大虾们帮帮忙,小弟在线等待,谢谢!

解决方案 »

  1.   

    服务器端的代码:
    在IdTCPServer1的OnExcute事件中
                 MyMemStream := TMemoryStream.Create;
                 try
                   AThread.connection.ReadStream(MyMemStream,-1,false);
                   ....
                   ....
                 finally
                   MyMemStream .free;
                 end;遇到的问题是:
        每次客户端一连接,代码如下:
           IdTCPClient1.Connect(10000);
       服务器端的代码就停留在readstream(MyMemStream,-1,false);这里,关闭客户端程序后,服务器端报错,并跳到finally 里执行MyMemStream .free;请问如何解决呢?大虾们帮帮忙,小弟在线等待,谢谢!
      

  2.   

    IdTCPClient1.Connect(10000);IdTCPClient1.send...
      

  3.   

    你的服务器端ReadStream的第二个参数为-1,且第三个参数为False,则表示先读取一个整型数字以确定stream数据的长度;但 indy 在这个部分, 比较麻煩,如果没有收到就会一直等下去,等待接收,直到断线为止,除非你用AReadUntilDisconnect。
    如果要避免 server一直在作readstream的waitting,可以设计一个通用的 timeout 机制 , 把连线过久的 socket 砍掉 ,这样 , readstream 应该就会收到断线之前的所有资料.
      

  4.   

    如果服务器端的第二个参数为-1,第三个参数为false,则客户端的第三个参数必须为true.
      

  5.   

    和感谢各位的帮助。
    客户端发送文件的代码如下:
      try
        ....
        ....
        IdTCPClient1.WriteStream(SendMemSteam, true, true);  
      finally
        SendMemSteam.free;
      end;现在的问题是在客户端连接服务器的时候,即客户端在执行IdTCPClient1.Connect这句代码时,在服务端会触发OnExcute事件,而且停留在readstream(MyMemStream,-1,false);这句代码上,直至客户端程序关闭。
      

  6.   

    问题关键是在于如何避免客户端在连接(IdTCPClient1.Connect)时,不让服务端停留在readstream(MyMemStream,-1,false);这句代码上
      

  7.   

    在onexec事件里面不要直接接受,先判断是否连接
    if (not AThread.Terminated) and (AThread.Connection.Connected)  then
      begin
    ...利用ReadFromStack
    然后解析
      

  8.   

    问题解决了,很感谢大虾dabaicai(不再做菜鸟)