Python实现web聊天室「建议收藏」

Python实现web聊天室「建议收藏」使用Python模块中的select模块实现web聊天室功能select模块Python中的select模块专注于I/O多路复用,提供了selectpollepoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统)参数:可接受四个参数(前三个必须)r…

大家好,又见面了,我是你们的朋友全栈君。

使用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 

in 
rlist:
                
if 

=
= 
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 

in 
self
.socketList:
            
if 
i !
= 

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
    

= 
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,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152175.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 服务器性能监视器_性能计数器感叹号

    服务器性能监视器_性能计数器感叹号文章来源:http://blog.csdn.net/lhfzd2004/article/details/1722379上一篇文章《服务器性能监控之WMI》介绍了通过远程com获取服务器性能(当然也可用于本地),那么这篇主要说说windows系统自带的性能监视功能—–>performancecouonter.打开管理工具–>性能,我们可以立即看到服务器的CPU,进程运行时间,磁盘容量

    2022年10月8日
    0
  • 妥妥的世界第一:为什么MT4软件的地位无法撼动?

    妥妥的世界第一:为什么MT4软件的地位无法撼动?我是漆学军,2004年接触MT3.83的时候,还没有太在意,直到2005年,MT4正式推出之后,我就再也没有真正爱上别的软件,即便是MT4的升级版本MT5,我也一直提不起太大兴趣。外汇市场上有很多不同类型的交易软件,包括占领了大部分外汇交易市场的MT4、MT5、cTrader和各个机构自行研发的交易软件等等,然而,尽管竞争者很多,已经发布十六年了的MT4平台却依旧称得上是“交易软件之王”,市场占有率稳居世界第一,在外汇市场上具备不可动摇的地位。MT4平台简介MetaTrader4(MT4)..

    2022年5月29日
    103
  • pytorch tensorboard使用_铅球是什么体育X项目

    pytorch tensorboard使用_铅球是什么体育X项目目录什么是TensorboardX配置TensorboardX环境要求安装使用pip安装从源码安装使用TensorboardX一些tips什么是TensorboardXTensorboard是TensorFlow的一个附加工具,可以记录训练过程的数字、图像等内容,以方便研究人员观察神经网络训练过程。可是对于PyTorch等其他神经网络训练框架并没有功能像Tensorboard…

    2022年10月11日
    1
  • read digest_view the readme file

    read digest_view the readme file一、本文大纲系统调用的两种方式:中断门和快速调用_KUSER_SHARED_DATA结构使用cpuid指令判断当前CPU是否支持快速调用3环进0环需要更改的4个寄存器以ReadProcessMemory为例说明系统调用全过程重写ReadProcessMemory和WriteProcessMemoryint0x2e和sysenter都做了什么工作?二、中断门和快速调用以我的理解,系统调用,即从调用操作系统提供的3环API开始,到进0环,再到返回结果到3环的全过程

    2022年9月12日
    0
  • docker安装使用_docker 安装centos

    docker安装使用_docker 安装centos一.安装docker1.删除已安装的dockeryumremovedocker\docker-client\docker-client-latest\docker-common

    2022年8月16日
    4
  • 蓝桥杯单片机必备知识 —— (2)关闭LED灯,BUZZ以及零碎知识

    蓝桥杯单片机必备知识 —— (2)关闭LED灯,BUZZ以及零碎知识

    2021年4月12日
    164

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号