服务器模型:
循环服务器:循环服务器在同一个时刻只可以响应一个客户端的请求
并发服务器:并发服务器在同一个时刻可以响应多个客户端的请求
##############################################################################################
循环服务器:
1. 循环UDP服务器
UDP服务器每次从套接字上读取一个客户端的请求,处理, 然后将结果返回给客户机.
可以用下面的算法来实现.
socket(...);
bind(...);
while(1)
{
recvfrom(...);
process(...);
sendto(...);
}
因为UDP是非面向连接的,没有一个客户端可以老是占住服务端. 只要处理过程不是死循环,
服务器对于每一个客户机的请求总是能够满足.
-------------------------------------------------------------------------------------------------------
2. 循环TCP服务器
TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接.
算法如下:
socket(...); //创建一个TCP套接字
bind(...); //绑定公认的端口号
listen(...); //监听客户端连接
while(1) //开始循环接收客户端连接
{
accept(...); //接收当前客户端的连接
while(1)
{ //处理当前客户端的请求
read(...);
process(...);
write(...);
}
close(...); //关闭当前客户端的连接,准备接收下一个客户端连接
}
TCP循环服务器一次只能处理一个客户端的请求.只有在这个客户的所有请求都满足后,
服务器才可以继续后面的请求.这样如果有一个客户端占住服务器不放时,其它的客户机
都不能工作了.因此,TCP服务器一般很少用循环服务器模型的.
##############################################################################################
并发服务器:
1. 并发fork()TCP服务器
为了弥补循环TCP服务器的缺陷,人们又想出了并发服务器的模型. 并发服务器的思想是
每一个客户机的请求并不由服务器直接处理,而是服务器创建一个"子进程"来处理. 算法如下:
socket(...);
bind(...);
listen(...);
while(1)
{
accept(...);
if(fork(..)==0) {
while(1)
{
read(...);
process(...);
write(...);
}
close(...);
exit(...);
}
close(...);
}
TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况. 不过也同时带来了一个
不小的问题.为了响应客户机的请求,服务器要创建子进程来处理. 而创建子进程是一种
非常消耗资源的操作.
-------------------------------------------------------------------------------------------------------
2. 并发多路复用I/O
为了解决创建子进程带来的系统资源消耗,人们又想出了多路复用I/O模型. 这就要使用select,
我们的服务器程序就变成了.
初始化(socket,bind,listen);
while(1)
{
设置监听读写文件描述符(FD_*);
调用select(listen_fd);
if(监听套接字)//如果是监听套接字就绪,说明一个新的连接请求建立
{
建立连接(accept);
加入到监听文件描述符中去;
}
else//否则说明是一个已经连接过的描述符
{
进行操作(read或者write);
}
}
多路复用I/O解决资源限制的问题.这模型实际上是将UDP循环模型用在了TCP上面. 这也就带来了一些问题.
如由于服务器依次处理客户的请求,所以可能会导致有的客户会等待很久
-------------------------------------------------------------------------------------------------------
3. 并发UDP服务器
人们把并发的概念用于UDP就得到了并发UDP服务器模型.
和并发的TCP服务器模型一样是创建一个子进程来处理的,算法和并发的TCP模型一样.
除非服务器在处理客户端的请求所用的时间比较长以外,人们实际上很少用这种模型.
阅读(8444) | 评论(0) | 转发(10) |