Python实现web聊天室

简介:

使用Python模块中的select模块实现web聊天室功能

select模块

Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统)


参数: 可接受四个参数(前三个必须)

    rlist: wait until ready for reading

    wlist: wait until ready for writing

    xlist: wait for an “exceptional condition”

    timeout: 超时时间


select方法:

    每次调用slect都要将所有的fd拷贝到内核空间(每次都要拷贝),导致效率下降

    每次调用slect都要将所有的fd拷贝到内核空间(每次都要拷贝),导致效率下降

    监听的的实现是通过遍历所有的fd,(遍历消耗的时间消耗多)判断是否有数据访问

    最大连接数(input中放的文件描述符数量1024)

pull方法:

    最大连接数没有限制了,除此之外和select一样。使用较少

epull方法:

    内部通过3个函数实现(select是其中一个)

    第一个函数:
      创建epoll句柄,把所有的fd拷贝到内核空间,只需要拷贝一次

    第二个函数: 回调函数
    某一个函数或者动作成功完成后,会自动触发一个函数为所有的fd绑定一个回调函数,一旦有数据访问,触发改回调函数,回调函数把fd放到链表中。(只要有活动,把fd放到链表中,动态监听)这样就提高了效率。例子:交试卷

    第三个函数,判断链表是否为空


server端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#/usr/bin/env python
#-*- coding:utf-8 -*-
import  socket
import  select
# 封装
class  SelectServer( object ):
     # 定义主函数
     def  __init__( self , host, port, backlog):
         self .host  =  host
         self .port  =  port
         self .address  =  (host, port)
         self .backlog  =  backlog
         self .server  =  None
         self .socketList  =  list ()
 
     def  _initSocket( self ):
         self .server  =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self .server.bind( self .address)
         self .server.listen( self .backlog)
         self .socketList.append( self .server)
         print ( "chat room has start!" )
         while  1 :
             rlist, wlist, elist  =  select.select( self .socketList, [], [])
             for  r  in  rlist:
                 if  r  = =  self .server:
                     serverConn, clienAddr  =  self .server.accept()
                     self .socketList.append(serverConn)
                     print ( "{0}进入了房间" . format (clienAddr))
                     self .broadcast(r,  "{0}进入了房间" . format (clienAddr))
                 else :
                     try :
                         data  =  r.recv( 2048 )
                         if  data:
                             print ( "{0}: {1}" . format (clienAddr, data))
                             self .broadcast(r,  "{0}: {1}" . format (clienAddr, data))
                     except  Exception as e:
                         self .broadcast(r,  "{0}下线" . format (clienAddr))
                         print ( "{0}下线" . format (clienAddr))
                         r.close()
                         self .socketList.remove(r)
         self .server.close()
     # 定义广播函数
     def  broadcast( self , r, data):
         for  i  in  self .socketList:
             if  i ! =  r  and  i ! =  self .server:
                 try :
                     i.sendall(data)
                 except :
                     i.close()
                     self .socketList.remove(i)
# 定义main函数
def  main():
     selectServer  =  SelectServer(host = "192.168.154.131" , port = 9999 , backlog = 5 )
     selectServer._initSocket()
 
if  __name__  = =  '__main__' :
     main()


client端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#/usr/bin/env python
#-*- coding:utf-8 -*-
import  socket, select, string, sys
import  time
 
# main function
if  __name__  = =  "__main__" :
     host  =  "192.168.154.131"
     port  =  9999
     s  =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.settimeout( 2 )
     try :
         s.connect((host, port))
     except :
         print ( 'Unable to connect' )
         sys.exit()
     print ( 'Connected to remote host. Start sending messages' )
 
     while  1 :
         rlist  =  [sys.stdin, s]
         read_list, write_list, error_list  =  select.select(rlist, [], [])
         for  sock  in  read_list:
             if  sock  = =  s:
                 data  =  sock.recv( 2048 )
                 if  not  data:
                     continue
                 else :
                     sys.stdout.write(data)
             else :
                 msg  =  raw_input ( "我说: " )
                 s.sendall(msg)




本文转自 粗粮面包 51CTO博客,原文链接:http://blog.51cto.com/culiangmianbao/2058054,如需转载请自行联系原作者
相关文章
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
784 158
|
存储 监控 安全
如何在Python Web开发中确保应用的安全性?
如何在Python Web开发中确保应用的安全性?
798 157
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
478 61
|
存储 开发框架 关系型数据库
Python Web开发
Python Web开发
643 157
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
1465 86
|
IDE 开发工具 Python
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级,不升级无法使用,安装python扩展包的时候一直停留在installing
469 4
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
870 1
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
856 14
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
373 61

推荐镜像

更多