使用Socket实现一对多通信 (一个服务器多个客户端)使用Socker socketClent =  socket.Accept();  得到客户端的连接再使用socketClent .Receive(Byte[] buffe);  得到客户端传输的数据
这里使用了两个信号量  Socket.Accept();   sock.Receive(Byte[] buffe);     两个方法都是等待信号量的。这样做的后果就是每一个客户端连接到服务器。 服务器都需要分配一个线程 这个线程等待客户端的响应。
如果说我有50个客户端连接到服务器,即便这50个客户端没有传递数据。CPU也会分配50个线程等待客户端的数据。 这样太耗费CPU资源了 。   
所以我想减少线程的使用。  我想。 能不能用一个线程  处理Socket 接收到的所有数据。
现在我遇到的问题是:   我能不能用同一个Socket 接收到 各个不同的客户端 发送过来的数据呢?
还有什么后续其他我没有想到的问题。 也请各位指教

解决方案 »

  1.   

    Socket是否 不能实现上面的功能呢?
      

  2.   

    “我能不能用同一个Socket 接收到 各个不同的客户端 发送过来的数据呢?”
    可以,用UDP。用TCP其实也可以不用开那么多线程。BeginAccept、BeginReceive和SocketAsyncEventArgs都是基于完成端口的,不论多少连接,所用CPU线程也不过是线程池的线程数量,一般是CPU数量*2。
      

  3.   

    其实我之前就是一个客户端一个线程处理的。 做的事一个数据传输程序。 客户端会自动采集数据 向服务器发送。   有20多个客户端连接到服务器。 开始是没有什么问题。 就是服务器运行一天以后 CPU使用率可以一直居高不下 达到80%   。我找了好久。 发现多线程  对CPU的占用是很高的。 线程太多。 CPU 就一直在不同的线程之间切换运算。 所以 极有可能就是因为线程太多导致CPU使用太高。   
      

  4.   

    我在网上看到有 异步 Socket   不知道有没有了解这个的 能谈谈经验。  我继续找资料。
      

  5.   

    BeginAccept、BeginReceive和SocketAsyncEventArgs都是基于完成端口的,不论多少连接,所用CPU线程也不过是线程池的线程数量,一般是CPU数量*2。 计算密集型工作,采用多线程;
     IO密集型工作,采用异步机制,它们都是默认放入线程池中的;这是抓页面的例子,你改成你的SOCKET,就行了,思路都是一样,如果看不懂,就只能MSDN了,最好的教师。private void buttonGetPage_Click(object sender, EventArgs e)
            {
                var request = HttpWebRequest.Create("http://www.sina.com.cn");
                request.BeginGetResponse(this.AsyncCallbackImpl, request);
            }        public void AsyncCallbackImpl(IAsyncResult ar)
            {
                WebRequest request = ar.AsyncState as WebRequest;
                var response = request.EndGetResponse(ar);
                var stream = response.GetResponseStream();
                using (StreamReader reader = new StreamReader(stream))
                {
                    var content = reader.ReadLine();
                    textBoxPage.Text = content;
                }
            }
      

  6.   

    使用非阻塞模式ioctlsocket可以满足要求,多个客户端连接一个服务端