当前位置: 技术问答>linux和unix
服务端设计问题(没人比我发分快了)
来源: 互联网 发布时间:2016-10-13
本文导语: 在做一个发送文件项目(server端):怎么才能提高工作效率。。。现在是用select; login(登陆) mo(client主动发送文件) mt(server主动发送文件:client向不在线的client发送) 当我监听到连接后,分一条线程给client,...
在做一个发送文件项目(server端):怎么才能提高工作效率。。。现在是用select;
login(登陆) mo(client主动发送文件) mt(server主动发送文件:client向不在线的client发送)
当我监听到连接后,分一条线程给client,client发送登陆请求包,服务端接收登陆请求,并响应,client才正式登陆;
登陆后不断开,举个例子(QQ);登陆后可以做其他事情,但这些都不经过server端。只有MO发生才经过;
我的工作流程是:
我现在是登陆之后就进入循环了,这个应该很影响性能,phread里面的while,在此处阻塞着,不能走完整个程序。
有客户进来又分一条线程,同样进入循环。
猜想:
设置成非阻塞,
1;可否在login时,从线程池分一条出来出来处理login,工作完后放回去,(回去后login会断开不);
2;登陆后,MO时(有时文件比较大),从线程池分一条出来出来处理MO,工作完后放回去。
这样,就不用在里面循环了,走完整个流程,即有什么就触发什么,但要求不断开。
想到我发蒙了...
流程要怎么走才更合理?
login(登陆) mo(client主动发送文件) mt(server主动发送文件:client向不在线的client发送)
当我监听到连接后,分一条线程给client,client发送登陆请求包,服务端接收登陆请求,并响应,client才正式登陆;
登陆后不断开,举个例子(QQ);登陆后可以做其他事情,但这些都不经过server端。只有MO发生才经过;
我的工作流程是:
listen;
while{
accept;
select;
phread//分配线程
{
login;//发包
MT;//(检查有没有人向我发送消息,离线信息);
while()//循环接收信息,满足条件退出
{
case:MO->MT;//MO经过服务端,再从服务端发送给client,MO,MT都要经过得到响应后才能工作,响应信息即代表发送成功与否。
case:link();//链路检查
}
exit;//条件满足,释放内存,跳槽线程,退出登录
}
}
我现在是登陆之后就进入循环了,这个应该很影响性能,phread里面的while,在此处阻塞着,不能走完整个程序。
有客户进来又分一条线程,同样进入循环。
猜想:
设置成非阻塞,
1;可否在login时,从线程池分一条出来出来处理login,工作完后放回去,(回去后login会断开不);
2;登陆后,MO时(有时文件比较大),从线程池分一条出来出来处理MO,工作完后放回去。
这样,就不用在里面循环了,走完整个流程,即有什么就触发什么,但要求不断开。
想到我发蒙了...
流程要怎么走才更合理?
|
可以考虑让主线程调用select
检测到指定条件后,派发给一个线程来处理,处理完毕,线程回到线程池
用一个集合应该也可以
检测到指定条件后,派发给一个线程来处理,处理完毕,线程回到线程池
用一个集合应该也可以
|
用select,有东西他才去干,就不用while(1)在那等着了吧。
用一个数组存放连接的描述符,然后select他就可以了。
用一个数组存放连接的描述符,然后select他就可以了。
|
可以了,还要考虑如何退出.
线程里想清楚了吗?
|
服务器所要支持的并发大不?如果大的话,用epoll替代select。
|
路过,看不出什么问题,呵呵,关注一下
|
谢谢 你们的提供