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