我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python实现web聊天室

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

Python实现web聊天室

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现web聊天室

使用Python模块中的select模块实现web聊天室功能select模块Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持sel
2023-01-31

python socket实现聊天室

本文实例为大家分享了python socket实现聊天室的具体代码,供大家参考,具体内容如下 server端import socket import json,struct from concurrent.futures import Th
2022-06-02

Python Web聊天室(二)--首页

今天来完成我们聊天室的首页首先创建appmanage.py startapp chat2.编辑视图文件(chat/views.py)# chat/views.py# 需要导入的包,有些包目前还没有用到,但是以后会用from django.s
2023-01-31

Python聊天室

小编心语:锵锵锵!各位看官注意了啊,走过路过表错过!上篇博文主要介绍了基于基于Server-Sent Event的简单在线聊天室,相信不管各位是大牛、小牛还是跟小编一样的小白,可能觉得看得不够过瘾,区区一个小小即时聊天又怎能满足大家的需求。
2023-01-31

Java聊天室之实现聊天室服务端功能

这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室服务端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
2022-11-13

Java聊天室之实现聊天室客户端功能

这篇文章主要为大家详细介绍了Java简易聊天室之实现聊天室客户端功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
2022-11-13

如何使用Springboot+netty实现Web聊天室

这篇文章主要为大家展示了“如何使用Springboot+netty实现Web聊天室”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Springboot+netty实现Web聊天室”这篇文章
2023-06-21

小小聊天室Python代码实现

相对于Java方式的聊天室,Python同样可以做得到。而且可以做的更加的优雅。想必少了那么多的各种流的Python Socket,你一定会喜欢的。 至于知识点相关的内容,这里就不多说了。 UDP方式 服务器端# coding:utf-8
2022-06-04

Python怎么实现在线聊天室私聊

本篇内容主要讲解“Python怎么实现在线聊天室私聊”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现在线聊天室私聊”吧!实现思路对于私聊,我觉得应该有如下两点需要实现私聊列表更
2023-06-02

python实现简易聊天室(Linux终端)

本文实例为大家分享了python实现简易聊天室的具体代码,供大家参考,具体内容如下 群聊聊天室1.功能:类似qq群聊功能1.有人进入聊天室需要输入姓名,姓名不能重复2.有人进入聊天室,其他人会受到通知 xxx进入聊天室3.一个人发消息,其他
2022-06-02

如何用python实现简易聊天室

本篇内容主要讲解“如何用python实现简易聊天室”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用python实现简易聊天室”吧!1.功能:类似qq群聊功能1.有人进入聊天室需要输入姓名,姓
2023-06-20

AngularJS+Node.js实现在线聊天室

不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍,对于基本的使用依然有很多说不清道不明的疑惑,于是决定通过做一个在线聊天室帮助理解。DEMO可
2022-06-04

android socket聊天室功能实现

前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录