你里的消息管理机制指的是什么?在 ServerSocket里 ,当有接收到客户端发送过来的消息的时候
触发ServerSocket1ClientRead事件。ServerSocket1.Socket.Connections[i];可以表示已经建立的TCP/IP连接。
比如ServerSocket已经被两个ClientSocket连接上了的话,那么ServerSocket1.Socket.Connections[0]表示第一个连接,ServerSocket1.Socket.Connections[1]表示第二个连接。

解决方案 »

  1.   

    yypp:你说的那是连接管理,不是消息处理,我讲的消息处理是这样的:自己创建一个窗口,这个窗口有一个窗口过程,并为这个窗口建立一个消息队列,所有的socket消息都存放在这个队列里,通过OnMessage事件从队列里读取消息,判断是连接请求消息还是client端发来的data信息再分别进行处理。而不是delphi自身的创建一个窗口用于专门管理连接,再为每个连接创建一个窗体。
      

  2.   

    纠正一下,你的说法有问题,ServerSocket会为每一个连接开一个线程,而不是窗口,如果非要在一个线程中处理所有连接的话,就只有把ServerType特性设为stNonBlocking,即采用阻塞方式连接每一个客户,所有的连接都在一个单独的线程中处理,并且用异步的OnClientWrite和OnClientRead来件来通知服务器端进行读或写
      

  3.   

    上面的好像说错了吧,stNonBlocking是非阻塞方式
      

  4.   

    YangYun():在非阻塞方式下,是每个连接都有自己的连接管理窗口,这是一个Windowtool窗口,资源从GDI分配,这个窗口的句柄和连接的Socket句柄是一样的。创建线程的是阻塞方式。我要讨论的是非阻塞方式,即stNonBlocking方式。
      

  5.   

    airhorse(编程至尊宝) 分数那好商量,我再追加200够了吧?
      

  6.   


        既然你的服务器是一个多客户端消息队列模式,那你为什么还有ServerSoket这种入门级的控件来写你的高效的的服务例程呢?
        你应该直接用win sock来写。
      

  7.   

    我是用winsock作了一个自己的socket控件,在这个控件里采用了多客户端消息队列模式
      

  8.   

    你写的控件是否继承TCustomWinSocket,如果是,那客户端的消息都会发送到CM_SOCKETMESSAGE
    中,看你想做什么。
    我怎么看半天,没看清你想做什么。
      

  9.   

       你已经讲的够清楚了,那里有问题吗:
        我讲的消息处理是这样的:自己创建一个窗口,这个窗口有一个窗口过程,并为这个窗口建立一个消息队列,所有的socket消息都存放在这个队列里,通过OnMessage事件从队列里读取消息,判断是连接请求消息还是client端发来的data信息再分别进行处理。而不是delphi自身的创建一个窗口用于专门管理连接,再为每个连接创建一个窗体。 
      

  10.   

    copy_paste(木石三) :是的,是继承自TCustomWinsock,我是将所有的关于阻塞方式的代码剔除了。也就是全都用非阻塞方式。然后我又在非阻塞方式下创建了两个线程,一个用来管理连接的建立(TserversocketclientacceptThread);一个用来管理连接(TManageclientThread)。
    第一个没问题。第二个我一直没搞出来。我的实现原理是这样的:
    1)创建TManageclientThread
    2)在TManageclientThread中建立一个窗口(messagehandle),专门负责所有socket通信消息(不是连接请求消 息)的处理。
    3)TManageclientThread有一个消息队列,所有socket消息都存放在这个队列里。
    4)通过GetMessage从消息队列里取得消息后,判定是否为socket通信消息,是的话直接送
       messagehandle窗口处理。这样我就不用为每一个client连接建立一个连接管理窗口。从而达到节省系统资源的目的。(因为我的系统要求的client连接有几千个。而且一定要用TServersocket控件来实现。######最好能给我较详细的源码,不要是几句话的建议。
      

  11.   


    const
      WM_MyFirstSocketMessage = WM_User + 1;
      WM_MyLastSocketMessage = WM_MyFirstSocketMessage + 1;type 
      
      TManageClientThread = class(TThread) 
      private
        FParentHandle: THandle; 
        FYourServerSocket: TYourServerSocket;
      protected
        procedure Execuate; override;
      public
        constructor Create(AServerSocket: TYourServerSocket);
      end;constructor TMangeClientThread.Create(AServerSocket: TYourServerSocket);
    begin
      FYourServerSocket := AServerSocket;  
      FParentHandle := FYourServerSocket.Handle;   
      inhertied Create(not FYourServerSocket.Connected);
    end;procedure TMangeClientThread.Execuate;
    var
      Msg: TMsg;
    begin
      while FYourServerSocket.Connected do
      begin
        //GetMessage好像取出消息后并不从消息队列中删除,这样会循环访问已访问的消息。
        if PeekMessage(Msg, FParentHandle, WM_MyFirstSocketMessage,
          WM_MyLastSocketMessage, PM_REMOVE) then
        begin
          if Msg.hwnd <> FParentHandle then Continue;
          case Msg.Message of
            WM_MyFirstSocketMessage: // Do your code
      WM_MyLastSocketMessage:  // Do your code 
          end;     
        end else WaitMessage; 
      end;
    end;在Delphi的TServerSocket中不是你说的为每个客户端建立一个窗体,Block模式则只是根据客户的Socket新增了一个
    TServerClientSocket{= class(TCustomWinSocket)},如果是Thread模式中增加一个客户线程,如果有一个客户商连接后,服务端只是增加一个TServerClientSocket对像(线程则是多了一个TServerClientThread对象),并不是窗体。还有我觉得TServerSocket管理线程和客户端还是不会怎么样,可以不用自己写。
    可能你要的ServerSocket不是线程模式的。
      

  12.   

    copy_paste(木石三):能否保持联系??我的E-mail:hieefxz @163.net  oicq:5073699