文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python实现web聊天室

2023-01-31 05:58

关注

使用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端代码

#/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端代码

#/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)


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯