我现在为公司的网关程序作一个测试程序,这个测试程序就是创建大量的客户端(ClientSocket),然后连接同一个服务器(ServerSocket)。现在有几个问题想问一下:1.ClientSocket采用非阻塞模式时,当创建了少量的ClientSocket时,基本没有问题。当创建了几百个ClientSocket后,与ServerSocket频繁通信时,有时就会报“Socket  Error 10053”等错误。我觉得这可能是读写超时造成的,对于这种模式,有什么办法可以解决?2.ClientSocket采用阻塞模式时,我把ClientSocket作为TThread的子类的一个私有成员来用,目的是想用多线程技术来提高效率。但效果不明显,并且在TThread的Execute过程里,处理Clientsocket的读和写(通过TwinSocketStream)有问题,我在用TwinSocketStream读写前,先用它的WaitForData判断,可老是返回False,我已经从服务器给它发数据过来了。首先想问,我创建了几百个Thread可取吗?另外,哪位大侠可以提供一些阻塞模式+多线程的源代码,我将不胜感激!
    我的信誉值比较低,你们不要认为我不给分,那是因为我有一次不慎移贴的后果。

解决方案 »

  1.   

    换Indy组件是很费劲,Indy9支持线程,Indy10支持端口重叠,效率很高。
      

  2.   

    我用的还是TClientSocket控件,我在下面这个网址还有相关的一个问题,麻烦大家帮助一下:
    http://community.csdn.net/Expert/topic/3704/3704438.xml?temp=.6811487
      

  3.   

    不好意思,http://community.csdn.net/Expert/topic/3704/3704438.xml?temp=.6811487这个帖子我已删除了。
      

  4.   

    服务端使用TServerSocket的时候,非阻塞是用的异步选择IO模式。
    这种异步选择IO模式优点是不需要多线程,弱点是因为它使用了WINDOWS消息,于是它将受到
    WINDOWS消息队列长度的限制,,它不适应服务于太多客户端。当采用普通的多线程阻塞方式时,每个连接必须对应一个线程,数百个线程本身已经会耗掉大量内存
    和CPU资源,它也不适合太多客户端。。使用TwinSocketStream其实是使用的SOCKET的select IO模式,关于它的问题可以查相关SELECT函数
    的使用资料。
    使用少量线程服务于大量SOCKET连接,可以使用完成端口(IOCP)模式。
      

  5.   

    我的问题是用TwinSocketStream读数据时,读不出来。具体是因为TwinSocketStream.WaitForData返回False。奇怪的是:WaitForData也不是每次都返回False,有时候它也返回True。哪位可以帮我解释一下呢?服务器肯定是发数据给客户端了。
      

  6.   

    procedure TMyThread.Execute;
    var
      Stream: TWinSocketStream;
      B: Array[0..1023] of Char;
      S: String;
    begin
      { Place thread code here }
      Stream := TWinSocketStream.Create(FClientSocket.Socket, 10);//FclientSocket已正确连接和设置
      while (not Terminated) and (FClientSocket.Active) do
      begin
        if Stream.WaitForData(10) then
        begin
          //写数据到服务器
          stream.write(S, Length(S)); //假定S中已有了要发送的数据  
          //从服务器读数据 
          FillChar(B, 1024, 0);
          stream.Read(B, 1024);
        end;
      end;
    end;请问,我这样写对吗?有需要改进的地方吗?
      

  7.   

    Stream.WaitForData(10)
                     ~~~~呵呵。。0.01秒? 这时间设得也太短了吧