Indy的IDTCPServer在处理客户端数据的时候,
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
应该来说没个客户端是个独立线程(AThread),我通过IP来判端是谁的
数据来做相应的处理,比如Server现在要给10个客户端发很多个数据
包,每发一包都要等相应客户端应答返回相应的数据包,才能给这个
客户端发下一包,这时,会发生:
1、A客户端先开始处理,等B客户端开始处理时,A停了,开始处理B,等C开
始就开始不停的处理C,其他都停了,即使C处理完,其他也不会恢复
2、如果在收到某个客户端正确的包后要给它发下一包时做个延时,几个客户端
会同时处理一段时间,但最终都会停掉,不管延时多久(当然不可能在程序中
延时太长)

解决方案 »

  1.   

    说的是程序的错误现象
    我需要的是server能给所有的client同时发数据包,怎么做?
      

  2.   

    在程序里加以个 TIdAntiFreeze
      

  3.   

    看indy的Demo中的chat
    procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
    var
      Count: Integer;
      List : TList;
      EMote,
      Msg  : String;
    begin
      Msg := Trim(TheMessage);  EMote := Trim(memEMotes.Lines.Values[Msg]);  if WhoFrom <> 'System' then
        Msg := WhoFrom + ': ' + Msg;  if EMote <> '' then
        Msg := Format(Trim(EMote), [WhoFrom]);  List := tcpServer.Threads.LockList;
      try
        for Count := 0 to List.Count -1 do
        try
          TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);<-给客户端发数据
        except
          TIdPeerThread(List.Items[Count]).Stop;
        end;
      finally
        tcpServer.Threads.UnlockList;
      end;
    end;
      

  4.   

    又有个问题:不能通过IP来判断接入,因为IP有可能一样
    应该通过socket标识来判断
    TIdPeerThread的哪个属性可以判断出来socket的唯一标识?
      

  5.   

    IP+PORT来表示一个socket,这种方式对于当前的连接肯定是唯一的
      

  6.   

    没研究过Indy.
    如果是socket的话,可以用Handle属性判断。
      

  7.   

    我是使用
    Ip:Port这个格式的http://lysoft.7u7.net
      

  8.   

    如果实时性要求高,不要用TCP,另外,你可以在服务器端调用一个UDP控件,该控件实现了BroadCast方法,用‘255.255.255.255’来发,当然啦,客户端需要UDPServer来监听,并协调它与TCPClient的关系。
      

  9.   

    我遇到过此问题,当时是忘记加UnlockList所导致,你试试看
      

  10.   

    我也有类似问题,快崩溃了! 服务器跟多个客户端交互时,消息传递发生混乱了。不是indy自动为每个客户端分配线程吗?
      

  11.   

    呵呵,看来还是不用控件,直接用windsock api写好
      

  12.   

    IDTCPServer确实是自动分配线程的,但像TList可被线程访问的控件,就要做好线程安全措施了。
    否则就会出现访问冲突,应该就是你的情况。
    一般方法是线程读写前先LOCK了,读写完后再UNLOCK,在LOCKED期间,其他线程就访问不了,直到被UNLOCK为止。
    当然其他线程访问该控件时也要使用LOCK的,因为不LOCK的话仍然可以直接访问,那就没意义了
      

  13.   

    Type
      TClientObj = class
        Buffer:array of byte ;
        thread:TIDPeerThread ;
        
      end ;
    AThread.Data :=TClientObj.Create ;
    TClientObj(AThread.Data).Thread :=AThread ;....创建一个对像,AThread.Data指向它。。用它来保存客户端所有状态。。不必用IP来区分客户端.
      

  14.   

    要是使用一个公共数组,各线程的访问,会不会冲突??也需要lock?
      

  15.   

    >>其他socket控件可能也是一样
    用我的保证不会出现这个问题http://yafeisoft.nease.net/cn/download/yafei.zip