前言

就是自己想用python做一个聊天室,然后看看socket库,websocket库,有点底层,然后也会用到协程的东西,不是很明白,一时间也不知道怎么写,然后就用了封装好的python-socketio来实现,做好了以后,跟同学用,被吐槽说滚轮不会自动下滑到底部,难用,于是我找天找地,在网上啥也没找到,经过自己一个多小时的摸索,终于找到了解决方法
想看看聊天室代码的话,可以到https://github.com/cgynb/a-flask-project/tree/guiChatroom看看。或者直接访问这个地址

http://81.70.180.118:12347/聊天呀.exe

是打包好的程序,服务端有在服务器上跑着了,可以直接使用的,但是低版本的windows运行可能会有点问题

需求

需要用python-socketio实现双向通信
由于对协程不是很熟悉,不大会使用,所以我就先放弃使用asyncio,具体使用官方文档写的还是相当详细的,我这里就只说说这个聊天室通信的实现吧

具体内容

导入模块

socketio就是通信使用的模块了;
eventlet.wsgi是一个网络库,可以看看这篇文章,这里就不赘述了,因为我目前也没有能力搞得很明白;
random是一个随机数模块,因为是匿名聊天室,所以使用random产生随机整数从昵称文件里选取一个;
socket模块在这里是用来产生主机ip的,因为在运行的时候eventlet.wsgi.server(eventlet.listen((‘0.0.0.0’, 5000)), app),我是没想到,我这样写,它真就。。。(20380) wsgi starting up on http://0.0.0.0:5000,这样的,至于为什么把ip写成’0.0.0.0’,可以看看这篇文章;
logging是处理日志的模块,我这里并没有什么高级应用,只是为了打印一下上面用socket模块给到的主机ip罢了。。。

import socketio
import eventlet.wsgi
import random
import socket
import logging

打印主机ip

hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)logging.basicConfig()
logging.warning('        服务器ip:     ' + ip)

这样他就会打印出主机ip了,socket和logging库的使用就到此为止了

得到随机昵称

通过这里可以看到name_list是储存当前房间里的人的昵称的,可以看到name_list中元素是以(name, sid)的形式存储起来的,sid是客户端连接服务端的时候服务端分配给的唯一id,那么这里为什么要把sid和name绑定在一起呢,在后面会有讲到,这里是为了统计房间在线用户。random库的使用也到此为止了

name_list = []
def create_username(sid):with open('name.txt', 'r', encoding='utf-8') as f:names = f.readlines()names = list(map(lambda x: x.strip(), names))name = names[random.randint(0, len(names)-1)]while name in name_list:name = names[random.randint(0, len(names) - 1)]name_list.append((name, sid))return name

服务器跑起来

可以看到,我甚至连官方文档的注释都没有删,因为真的是复制过来就能用。。。那翻译一下第一行代码就是创建一个socket.io服务器,第二行是把他包装秤WSGI应用,那么WSGI又是什么呢,可以看看这篇文章
socket.io是一个事件驱动的库,可以看到最底下有个一装饰器@sio.on(‘msg’),如果有一点js基础的话可以知道这是一个事件监听函数,就是触发了这个事件,就会触发执行函数,具体来看,就是触发了msg事件,函数内部的sio.emit()函数就会携带data向连接服务端的用户(没有使用房间,否则可以发送到指定房间)发送’msg’事件。
那么上面的两个connect还有disconnect函数呢,为什么没有用@sio.on(‘connect’)和@sio.on(‘disconnect’)呢?诶,这里就要看看官方文档了

The connect, connect_error and disconnect events have to be defined explicitly and are not invoked on a catch-all event handler.

chrome自带的翻译一下

和事件必须明确定义connect,connect_error并且disconnect不能在包罗万象的事件处理程序上调用。

所以,只能使用@sio.event这个装饰器,当发生了connect/disconnect事件时,会执行connect和disconnect函数,那我们具体看看这两个函数
在connect函数中,我们可以看到data这个字典中的username是使用上面讲的create_username生成的,action表示这个客户端操作,是登陆,而name_list在客户端那里就可以改变用户列表,增加新用户。发送data
在disconnect函数中,得到断开用户的sid,删除name_list中该用户信息,然后发送data到客户端,即可改变用户列表,删除退出用户

# create a Socket.IO server
sio = socketio.Server()# wrap with a WSGI application
app = socketio.WSGIApp(sio)@sio.event
def connect(sid, environ, auth):data = {'username': create_username(sid), 'action': 'login', 'name_list': name_list}sio.emit('msg', data)print('connect ', sid)@sio.event
def disconnect(sid):for i, j in name_list:if j == sid:name_list.remove((i, j))sio.emit('msg', {'action': 'logout', 'name_list': name_list})print(name_list)print('disconnect ', sid)@sio.on('msg')
def msg(sid, data):print(data)sio.emit('msg', data)if __name__ == '__main__':eventlet.wsgi.server(eventlet.listen(('', 5000)), app)

不知道各位有没有发现,登录,退出,发送消息,用的都是’msg’事件,这样不会乱掉吗,其实是不会滴,因为可以看到,不同动作,我设置的action不同,这样客户端就可以辨识应该做什么(做几次判断action即可)。

总结

通信的内容就这么多了,内容不多,如有问题,请多多指教

基于python实现的聊天室(服务端)相关推荐

  1. 安卓多人聊天室服务端

    安卓多人聊天室服务端 服务端没有图形界面,直接上代码 package cn.ttw.netProgram.tcp;import java.io.*; import java.net.InetAddre ...

  2. 基于python实现的聊天室(客户端:一)窗口设置

    前言 就是自己想用python做一个聊天室,然后看看socket库,websocket库,有点底层,然后也会用到协程的东西,不是很明白,一时间也不知道怎么写,因为前面使用过了flask-socketi ...

  3. python与html5搭建聊天室_html5 websocket 新版协议聊天室 服务端(python版)

    网上找了很多代码都是旧版协议的,研究了很久终于弄清楚了 现在发个用新版协议写的服务端代码出来(这个代码是从网上旧版协议改过来的) 最要就是握手协议和发送接受字符的方式变了 # incoding=utf ...

  4. 从头搭建一个基于 Python 的在线聊天室

    本场 Chat,是基于 Python + Redis + Flask 来搭建一个简单易用的在线聊天室.完全从零开始,一步一步完成整个项目. 主要分享内容: Flask 项目结构 Python Redi ...

  5. 聊天室服务端和客户端的实现

    在Linux环境下,实现客户端和服务端之间的信息发送和接收,实现聊天室,可进行文件传送功能. 客户端: #include <sys/types.h> #include <sys/so ...

  6. python多线程tcp客户端_基于Python多线程的TCP客户端/服务端应用示例

    每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接. 服务端:server.py # -*- coding:utf-8 -*- import sys i ...

  7. python界面编程和网口通信_基于python的GUI聊天室设计

    " 套接字 " ,用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之 间的通信.在 Internet 上的主机一般运行了多个服务软件,同时提供几种 ...

  8. chatroom聊天室—服务端(基于golang)

    博客地址 golang,tcp服务--客户端 源码下载 功能支持 |1.修改用户名----dorenamerenamerename"修改的用户名" | 例如:修改用户名为java, ...

  9. 基于Python的实时聊天室开发

    资源下载地址:https://download.csdn.net/download/sheziqiong/85651573 一.采用了 pyqt 和 thinker 两个前端模块 开发过程:先使用 q ...

最新文章

  1. React Diff 算法
  2. 5号发工资和25号发工资,真能看出公司是否靠谱?
  3. html form表单提交数据并后台获取
  4. Python计算机视觉:第一章 图像处理基础
  5. 关于三维莫队问题的一些思考和探究
  6. 记录 之 TypeError: ‘int‘ object is not subscriptable
  7. Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载
  8. matlab中GUIDE的UItable居中方法
  9. 手机壁纸自动采集小程序源码
  10. 《纽约时报》:乔布斯是伟大的暴君
  11. 2020 OPPO开发者大会:融合共创,打造多终端、跨场景的智能化生活
  12. GitHub:围剿Python计划!程序员:早知必有一战!你站谁?
  13. Unix 网络编程 I/O 模型 第六章
  14. shell历史命令记录功能
  15. MySQL报错: Access denied for user 'root'@'localhost'
  16. Chivas 芝华士12年-广告歌Sarah Khider《Mermaid Song》
  17. vb 服务器mysql_VB 连接mysql网络数据库的代码
  18. 修改网站背景图html代码,HTML中更换或添加网站背景图片的代码怎么写?(示例)...
  19. leetcode 860.柠檬水找零 Java
  20. CTA认证system_process定位联网未明示问题

热门文章

  1. STM32 深入模拟数字转换器ADC
  2. 我的交易工具之价格反转图
  3. tws蓝牙耳机什么牌子好?2023tws耳机推荐
  4. 左移与右移(C语言)
  5. 软件开发设计中的上游与下游
  6. pylon主要示例功能说明
  7. 《炬丰科技-半导体工艺》SPM光刻工艺
  8. 打开Word显示“内存或磁盘空间不足,Word无法显示所请求的字体。”
  9. 机械电子工程和计算机联系应用,2021年华南师范大学电子信息、机械电子工程、自动化、计算机类调剂信息...
  10. 如何在NP下读写游戏内存及如何进入NP进程