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

解决方案 »

  1.   

    TO : boyfriendyu(空空)
    能给我一份吗?
    [email protected]
      

  2.   

    [email protected].
    谢谢 boyfriendyu(空空)
      

  3.   

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

  4.   

    [email protected]谢谢 boyfriendyu(空空)
      

  5.   

    FillChar(B, 1024, 0);
          stream.Read(B, 1024);
      

  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.   

    你第二种创建方法是不行的,在线程里创建的TClientSocket收消息时都是通过主程序的线程,你看看TClientSocket的create就知道了。如果要多线程接收数据,只能自己写线程,在线程中处理Socket消息。给点代码提示给你//创建用于接收封包消息的窗口句柄
    FMessageWinHandle := CreateWindow( 'STATIC','',WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
    SetWindowLong(FMessageWinHandle, GWL_WNDPROC , Longint(Classes.MakeObjectInstance(WinMsgProc)) );//消息代理函数,注意这是TThread_ParsePackage
    procedure TThread_ParsePackage.WinMsgProc(var Message: TMessage);
    begin
        try
            if Assigned(FSocketMsgProc) then FSocketMsgProc(Message);        Dispatch(Message);
        except
            if Assigned(ApplicationHandleException) then
                ApplicationHandleException(Self);
        end;
    end;//用delphi的方式处理消息,也可以直接在这个函数里处理,速度更快一些,但读起来可能会比较麻烦
    procedure TThreadSocket.ProcessMessage(var Message: TMessage);
    begin
        Dispatch(Message);
    end;//TThreadSocket的定义里加上
    procedure OnSocketMessage(var Message: TCMSocketMessage) ;message SM_SocketMessage;
    //这个函数怎么写就是你自己的事了。