如果程序采用c/s结构,他们之间采用UDP协议进行通讯。有两种方案来处理他们之间的交互。
方案一,如果当server端接收到来自客户端的请求,那么就建立一个
线程来处理这个客户的请求。方案二,server端就是一个线程,但是把所有的客户端的请求数据,都放在一个
队列中,按照先来先服务的算法依次处理。同时将处理完的数据也放在对列中等待发送。那么现在的问题是,在方案一中,如果同时有1000个客户端的请求,而且每一个请求处理的时间1-2秒,我想知道server端的承受能力。会不会因为客户端的不断请求而不断的建立,销毁线程而变得,压力太大??各位大侠你们的程序中,最多开过多少个线程,效率如何??在方案二中,我认为最大的问题是实时性的问题,也就是可能出现较大的延迟。还有这种方案中还可能出现什么问题???谢谢指点和讨论??

解决方案 »

  1.   

    不小心多开了一个贴子
    如果大家要回答的话,请到
    http://expert.csdn.net/Expert/topic/2950/2950600.xml?temp=.8976557
    谢谢!
      

  2.   

    对于高频但处理少的请求,建议用线程池。
    象aparch就是。
    这里有个例子:
    http://www.codeproject.com/threads/diggerthreadpool.asp?target=threadpool
      

  3.   

    我实现在的很多工程中都有这个方法,很有效。
    BOOL CServerSocket::ProcessEvent(int group,int Index)
    {
    WSAEnumNetworkEvents (ConnectedSocket[group][Index].conSocket ,NULL,&m_NetworkEvents);
    WSAResetEvent(m_hEvent[group][Index]);
    if(m_NetworkEvents.lNetworkEvents == FD_CLOSE)
    {
    WSAEventSelect(ConnectedSocket[group][Index].conSocket,m_hEvent[group][Index],0);
    OnClose(&ConnectedSocket[group][Index]);
    }else
    if(m_NetworkEvents.lNetworkEvents == FD_READ)
    {
    OnRead(&ConnectedSocket[group][Index]);
    }

    return TRUE;
    }
    这是部分代码
      

  4.   

    UINT CServerSocket::ListenThread(LPVOID lParam)
    {
    DWORD dwEventIndex;
    CServerSocket *Socket=(CServerSocket *)lParam;
    WSANETWORKEVENTS NetworkEvents; while(!Socket->m_bExit)
    {
    dwEventIndex = WaitForSingleObject(Socket->m_hEventListen,
    WSA_INFINITE); WSAEnumNetworkEvents (Socket->m_ListenSocket ,
    NULL,&NetworkEvents); WSAResetEvent(Socket->m_hEventListen); if(NetworkEvents.lNetworkEvents == FD_ACCEPT && !Socket->m_bExit)
    {
    Socket->OnAccept();
    }
    Sleep(0);
    }
    TRACE("ListenThread exit\n");
    return 0;
    }
    这是事件模式,我最近完成了,重叠模式但总的构架没变。
    完成端口正在写