求解答Socket线程问题

wenjunliao 2011-10-09 10:00:51
Socket服务端启动Listen后,调用BeginAccept方法等待客户端连接,当客户端连接成功后,调用BeginReceive方法,然后继续调BeginAccept方法,BeginReceive在执行回调事件的最后继续等待接收,这样的话,是不是就是说,如果我有1W个客户端长连接服务端,服务端就要有1W个线程来做这个工作呢。

Socket socket...
socket.Listen(10);

socket.BeginAccept(new AsycCallBack(AcceptCallBack),null);

private void AcceptCallBack(IAsyncResult ar)
{
Socket handler = socket.EndAccept(ar);
AsySocket NewSocket = new AsySocket(handler);
//激发事件
socket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
//重新监听
mSocket.BeginAccept(new AsyncCallback(AcceptCallBack), null);
}

private void ReceiveCallback(IAsyncResult ar)
{
try
{
//
StateObject state = ar.AsyncState as StateObject;
//读取数据
int bytesRead = mSocket.EndReceive(ar);
if (bytesRead > 0)
{
state.sb.Append(UTF8Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
string sb = state.sb.ToString();
if (sb.Length>0)
{
//接收完成
//激发事件
if (onStreamData != null)
onStreamData(mID, UTF8Encoding.UTF8.GetBytes(sb));
if (onStringData != null)
onStringData(mID, sb);
//
state = new StateObject();
state.workSocket = mSocket;
}
// Get the rest of the data.
mSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
}
catch (SocketException se)
{
if (onClosed != null)
onClosed(ID,se.Message);
}
catch (Exception e)
{
throw new ApplicationException(e.Message);
}

}
...全文
65 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjim 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wenjunliao 的回复:]
引用 7 楼 sbwwkmyd 的回复:

1W个长连接不是一个32位windows进程搞得定的,需要一个只管收发数据的中继器,常说的就是负载均衡


如果用中续器也会有个问题,我没办法知道客户端是不是断开连接了,必须用心跳去处理,最后还是会产生很多线程吧
[/Quote]
因为线程池采用的是任务队列的模式,只管收发数据的话,任务活动时间是极短暂的,所以一般是没问题的。
wenjunliao 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sbwwkmyd 的回复:]

1W个长连接不是一个32位windows进程搞得定的,需要一个只管收发数据的中继器,常说的就是负载均衡
[/Quote]

如果用中续器也会有个问题,我没办法知道客户端是不是断开连接了,必须用心跳去处理,最后还是会产生很多线程吧
showjim 2011-10-10
  • 打赏
  • 举报
回复
1W个长连接不是一个32位windows进程搞得定的,需要一个只管收发数据的中继器,常说的就是负载均衡
wenjunliao 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangyong0921 的回复:]

是的,有多少个客户端连接,你就要有多少个线程来处理

你看看线程池,同时注意,线程里面处理的事情不要太多
[/Quote]

那我如果客户端很多,服务端不是要爆掉,因为客户端都是长连接的,每个连接都分一个线程去处理,那我服务端内存不是要耗尽
Just4life 2011-10-10
  • 打赏
  • 举报
回复
是的,有多少个客户端连接,你就要有多少个线程来处理

你看看线程池,同时注意,线程里面处理的事情不要太多
  • 打赏
  • 举报
回复
用线程连接池
  • 打赏
  • 举报
回复
多看看线程设计吧。
Bullatus 2011-10-10
  • 打赏
  • 举报
回复
异步方法是基于线程池的吧,但连接还是太多了
只在此山中 2011-10-10
  • 打赏
  • 举报
回复
是,而且连接很多估计要优化。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧