在服务端,使用python官方的asyncio模块,利用asyncio.start_server方法生成服务器,对每个连接采取分而治之的思路,用协程方法同时进行多个连接。
客户端采用多线程,用两个线程分别运行接收机和发信机。

服务端

#server.py
import asyncio# 连接表
coonlist = []# 广播机
async def boarder(message: str, coonlist=coonlist):for writer in coonlist:date = message.encode('utf-8')  # 信息编码writer.write(date)# 定义服务器的事件处理
async def handle_echo(reader, writer):coonlist.append(writer)  # 保存发信机队列while True:data = await reader.read(100)if len(data) < 1: break  # 收到空数据即关闭连接message = data.decode('utf-8')addr = writer.get_extra_info('peername')print(f"Received {message!r} from {addr!r}")await boarder(message)#广播消息print("Close the connection")writer.close()coonlist.remove(writer)async def main():server = await asyncio.start_server(handle_echo, '127.0.0.1', 10000)addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)print(f'Serving on {addrs}')async with server:await server.serve_forever()asyncio.run(main())

客户端

# -*- coding: UTF-8 -*-
import threading
import socket# 客户端 发送一个数据,再接收一个数据
import timeclass Client:SERVER_IP='localhost'PORT=10000def __init__(self,serve_ip=SERVER_IP,port=PORT):self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 声明socket类型,同时生成链接对象self.client.connect((serve_ip, port))  # 建立一个链接,连接到服务器端口def __del__(self):self.client.close()def close(self):self.client.close()def __sender(self):while True:time.sleep(0.1)msg = input("\n发送的信息:")self.client.send(msg.encode('utf-8'))def __receiver(self):while True:data = self.client.recv(1024)if not data:print("\n没有消息。")breakmsg = data.decode('utf-8')print("\n收到的信息:", msg)def loop(self):receiver=threading.Thread(target=self.__receiver)receiver.start()sender=threading.Thread(target=self.__sender)sender.start()c=Client()
c.loop()

python socket 通信(2) 协程实现多人聊天室相关推荐

  1. python socket基于TCP/IP协议实现多人聊天室

    文章目录 前言 一.实现原理 二.queue队列 三.代码实现 四.需要注意的地方 五.总结 前言 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字 ...

  2. Python中基于TCP网络通信协议的多人聊天室

    1.服务端设置 1.1 相关配置信息 便于后期维护修改,将数据协议的相关配置和服务器配置,以及登录验证的数据库信息单独建立一个.py文件.需根据自己服务器ip修改. #------数据协议相关配置-- ...

  3. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  4. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  5. python并发编程之协程

    python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...

  6. python通信原理实验报告_【Python之旅】第五篇(一):Python Socket通信原理-阿里云开发者社区...

    只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理. 1.Socket socket也称作"套接字",用于描述IP地 ...

  7. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  8. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

  9. python实现简易聊天需要登录博客园zip下载_Python基于Socket实现简易多人聊天室的示例代码...

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  10. Python+Socket实现多人聊天室,功能:好友聊天、群聊、图片、表情、文件等

    一.项目简介 本项目主要基于python实现的多人聊天室,主要的功能如下: 登录注册 添加好友 与好友进行私聊 创建群聊 邀请/申请加入群聊 聊天发送图片 聊天发送表情 聊天发送文件 聊天记录保存在本 ...

最新文章

  1. Inner Join, Left Outer Join和Association的区别
  2. react 网易云音乐实战项目笔记
  3. UINavagationController页面跳转
  4. C语言头文件#includestdlib.h的作用
  5. treemap底层结构_HashMap面试必问的数据结构相关知识总结
  6. Nginx用为缓存服务器
  7. 三种常用的MySQL建表语句
  8. 解决Windows Update错误“80072EFD”
  9. 阿里云 禁用密码登录
  10. linux var mqm权限,MQ7.5通道权限问题
  11. 全国各地土特产一览表
  12. 用python操作浏览器的三种方式,详细介绍并附代码
  13. 2020微信小微商户、微信支付商业版签约商户流程
  14. MySQL数据库表的插入,修改,删除操作实验
  15. EBS MO_GLOBAL包的分析
  16. windows系统coursera视频播放出错解决方法
  17. l05173芯片针脚图_L05173TR
  18. 2021-Java面试题(03-29已更新)
  19. 戴尔笔记本——减低风扇声音的一种办法
  20. 除了Fiddler工具之外,其他常见的抓包工具(Charles、Wireshark)

热门文章

  1. 大数据Hadoop学习记录(1)----HDFS目录和文件Shell操作
  2. mysql 事物状态有几种_关于MySQL的二十个经典面试题
  3. python自动测试方法_python接口自动化测试二十一:类和方法
  4. 计算机启动与故障修复工具,Windows7异常启动的故障修复
  5. Javascript:使用js将数据导出到excel/csv
  6. 中文生成罗马音_现代建筑寿命仅50年,古罗马混凝土为何2000年越来越坚固?
  7. 标定_基于目标的激光雷达与相机外参标定方法汇总
  8. 论文阅读笔记(四)——ESPNetV2:A Light-weight Power Efficient and General Purpose Convolutional Neural Network
  9. 非常详细的机器学习知识点汇总(一)
  10. 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。