并发服务器

1.select优点:跨平台

缺点:对于单个进程的文件描述符的数量存在最大限制linux一般为1024,32位机器位1024,64位机器位2048
2.对socket进行扫描时是一次扫描的,即采用轮询的方法,效率较低
3.遍历列表浪费cpu时间
Poll优点:解决了套接字的上限问题
缺点:效率跟select一样使用轮询的方式比较低
Epoll优点:解决了支持上限问题,采用的是事件通知机制,而且效率提升不是轮询方式,它只管你活跃的链接
from socket import socket, AF_INET,SOCK_STREAM,SOL_SOCKET,SO_REUSEADDR
#创建tcp服务器套接字
server_socket = socket(AF_INET,SOCK_STREAM)
#绑定端口
server_socket.bind(("",9999))
#设置正常情况退出的服务器下 ,设置端口可以重用
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
#设置非阻塞,也就是说accept方法不阻塞了,
# 但是在没有客户端链接且被执行的时候会报错
#有客户端链接的时候正常执行
server_socket.setblocking(False)
#设置监听,变为主动监听
server_socket.listen(5)
while True:
   # 等待客户端的链接,返回新的socket和地址
   new_socket,new_address = server_socket.accept()
   #接收数据,并且发送数据
   try:
      while True:
         recv_data = new_socket.recv(1024)
         #当有客户端关闭后,recv解除阻塞,并且返回长度为0
         if len(recv_data) > 0:
            recv_content = recv_data.decode("gb2312")
            print("收到:%s的信息是:%s" % (str(new_address),recv_content))
            new_socket.send("thank you!".encode("gb2312"))
         else:
            print("客户端%s已经关闭" % (str(new_address)))
            break
   finally:
      new_socket.close()
      print("关闭%s客户端" % (str(new_address)))
#关闭tcp服务器套接字
server_socket.close()
1)当服务器为一个客户端服务时,而另外的客户端发起了connect,只要服务器listen的队列有空闲的位置,就会为这个新客户端进行连接,并且客户端可以发送数据,但当服务器为这个新客户端服务时,可能一次性把所有数据接收完毕。
2)当recv接收数据时,返回值为空,即没有返回数据,那么意味着客户端已经调用了close关闭了;因此服务器通过判断recv接收数据是否为空 来判断客户端是否已经下线。

1. select 原理

io多路复用:没有使用多进程和多线程的情况下完成多个套接字的使用。
select 能够完成一些套接字的检查,从头到尾检查一遍后,标记哪些套接字是否可以收数据,返回的时候,就返回能接收数据的套接字,返回的是列表。select是由操作系统提供的,效率要高些,非常快的方式检测哪些套接字可以接收数据。select是跨平台的,在window也可以用。
#检测列表client_lists那些socket可以接收数据,
#检测列表[]那些套接字(socket)可否发送数据
#检测列表[]那些套接字(socket)是否产生了异常
#这个select函数默认是堵塞,当有客户端链接的时候解除阻塞,
# 当有数据可以接收的时候解除阻塞,当客户端断开的时候解除阻塞

readable, wirteable,excep = select(socket_lists,[],[])

Web服务器案例

响应行GET / HTTP/1.1 响应头都是键值对  响应体没有长度限制,浏览器获取相应体内容翻译并显示
cookie :只要访问服务器,服务器会默认向客户端写入一些信息: key: value (response)---》保存到浏览器的cookie
目的:key:value--- >jseesionid=7hrhj9u98j ck dk9f
作用1
第二次又去访问服务器,request请求中携带jsessionid去服务器,服务器收到携带的jsessionid之后,就知道是否曾经访问过网站
作用2:
cookie中可以保存一些相关的数据
Web上每种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个通用资源标志符(Universal Resource Identifier, URI)进行定位。
URI通常由三部分组成:
①访问资源的命名机制;
②存放资源的主机名;
③资源自身 的名称,由路径表示。
 __import__("")动态导包

猜你喜欢

转载自blog.csdn.net/xiaoming0018/article/details/80353605