php仿qq群聊,用Python写一个类似qq群聊的聊天室
用Python写一个聊天室
功能 : 类似qq群聊
1. 进入聊天室需要输入姓名,姓名不能重复
2. 有人进入聊天室会向其他人发送通知
xxx 进入了聊天室
3. 一个人发消息,其他人会收到消息
xxx 说 : xxxxxxxx
4. 某人退出聊天室,其他人也会收到通知
xxx 退出了聊天室
先看我写的代码的运行结果:
准备文件:
tcp_s.py 服务端代码
tcp_c.py 用户端代码
tcp_s.py 代码:
from socket import *
from time import sleep
from select import *
import os
import sys
s = socket(AF_INET,SOCK_STREAM,0) #创建套接字对象
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置端口可重用
s.bind(('0.0.0.0',8888)) #绑定IP和端口号
s.listen(10) #设置最大可连接数
rlist = [s] #设置 读列表
wlist = [] #设置 写列表
xlist = [] #设置 出错列表
while True: #无限接收用户端信息
rs,ws,xs = select(rlist,wlist,xlist) #将s对象托管给select对象
for r in rs: #遍历返回的对象列表
if r is s: #如果对象是 s 套接字对象(服务端本身)
c,addr = s.accept() #与用户端连接
rlist.append(c) #将此用户对象保存起来
else:#如果对象是 c 套接字对象(用户端)
data = r.recv(1024).decode() #最大一次性接收1024字节,并将接收的内容转化为UTF8
if not data: #如果传过来没有数据,则认为是用户端已断开
rlist.remove(r) #将读列表中的此用户删除
else:#如果有数据传过来,则做相应处理
data = data.split('_:_') #拆分姓名和说话内容为一个列表
print(data) #打印列表
if data[1] == '': #如果没有传过来说话内容,则说明是第一次连接
data = data[0] + ' 进入聊天室' #生成 某某进入聊天室 的提示信息
for x in rlist: #遍历所有的 套接字对象
if x is s: #如果遍历到的套接字对象是服务端自己的对象,则略过
pass
else:#如果遍历到的套接字对象是用户端的对象,则发送消息(给所有用户发送一条 某某进入聊天室 的消息)
x.send(data.encode()) #发送消息
else: #如果有说话内容传入,则处理
data = data[0]+'说:'+data[1] #拆分说话人姓名和说话内容 保存为一个列表
for x in rlist: #遍历所有的 套接字对象
if x is s: #如果遍历到的套接字对象是服务端自己的对象,则略过
pass
else:#如果遍历到的套接字对象是用户端的对象,则发送消息(给所有用户发送一条 某某说:XXXXX 的消息)
x.send(data.encode()) #发送消息
tcp_c.py代码:
from socket import *
from time import sleep
from select import *
import os
s = socket(AF_INET,SOCK_STREAM,0) #创建套接字对象
addr = ('127.0.0.1',8888) #设置连接地址信息
name = input('请输入姓名>>') #要求输入姓名
s.connect(addr) #连接至服务端
info = name + '_:_' #设置信息的格式
s.send(info.encode()) #将名字发送至服务端
rlist = [s] #设置 读列表
wlist = [] #设置 写列表
xlist = [] #设置 出错列表
pid = os.fork() #开启一个子进程,用于专门接收从服务端传过来的对话数据
if pid == 0: #如果是子进程(用于处理服务端数据的进程)
while True: #无限接收服务端信息
rs,ws,xs = select(rlist,wlist,xlist)
e = 0 #设置一个标记 值 为0
for r in rs: #遍历所有的套接字对象
if r is s: #如果遍历到的套接字对象是 本模块的对象
data = r.recv(1024).decode() #接收从服务器传过来的数据
if not data: #如果没有数据,则说明服务端要断开
e = 1 #设置标记值为1
else:#如果有数据,则打印
print(data)#打印出数据
if e == 1: #如果标记被改为1,说明要断开,则跳出循环
break
else:#循环结束时打印一条消息
print('子结束')
elif pid > 0: #如果是当前进程(用于发送消息的进程)
while True: #无限处理要发送的信息
rs,ws,xs = select(rlist,wlist,xlist)
e = 0 #设置一个标记 值 为0
for r in rs: #遍历所有的套接字对象
if r is s: #如果遍历到的套接字对象是 本模块的对象
info = input('') #等待用户输入信息
if not info: #如果没有输入任何信息,则代表用户想要断开连接
e = 1 #设置标记值为1
info = name + '_:_退出了聊天室' #生成一条给服务端的信息
r.send(info.encode()) #最后再给服务端发送一句退出的消息
else: #如果有输入数据,则处理
info = name + '_:_' + info #将数据拼接成相应的格式
r.send(info.encode()) #将数据发送给服务端
if e == 1: #如果标记被改为1,说明要断开,则跳出循环
break
print('父结束') #循环结束时打印一条消息
else:
print('ERROR',pid)
s.close()
print('结束')
php仿qq群聊,用Python写一个类似qq群聊的聊天室相关推荐
- python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...
- 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
用Python写一个模拟qq聊天小程序的代码实例 发布时间:2020-09-09 07:49:29
- 用Python写一个模拟qq聊天小程序的代码实例
前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 Python 超简单的聊天 ...
- 用python做毕业设计小程序_用Python写一个模拟qq聊天小程序的代码实例
Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...
- 如何利用python实现qq聊天_用Python写一个模拟qq聊天小程序的代码实例
Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...
- python写一个系统-熬了一晚上,小白用Python写了一个股票提醒系统
码农小马七夕节去相亲了,见了一个不错的姑娘,长的非常甜美!聊着聊着很投缘!通过介绍人了解到,对方也很满意--想着自己单身多年的生活就要结束啦,心里满是欢喜,美美哒!但是突然想起年初还有几万块在股市里面 ...
- 用python写聊天机器人_用Python 写一个机器人陪你聊天(文尾有彩蛋)
工作一忙,原来秉烛夜谈的好友现在都很少聊天,微信都成了微信群的天下,鲜有微信好友给你发消息,想要主动发却也找不到开题话题,怎么办?用Python写一个机器人陪自己聊聊天吧.以下是源码及解析,小白都看得 ...
- 用Python 写一个机器人陪你聊天(文尾有彩蛋)
工作一忙,原来秉烛夜谈的好友现在都很少聊天,微信都成了微信群的天下,鲜有微信好友给你发消息,想要主动发却也找不到开题话题,怎么办?用Python写一个机器人陪自己聊聊天吧.以下是源码及解析,小白都看得 ...
- python写一个系统-使用Python写一个量化股票提醒系统
大家在没有阅读本文之前先看下python的基本概念, Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开 ...
最新文章
- Beautiful Array
- C语言哆啦a梦用printf输出,【2013.1.20】故事的最后,哆啦A梦终于又回到了大雄身边。从此两个人过上了…——ProtoType...
- ad19pcb所有元件都在报错_PLC的线圈输出和置复位,可以混用吗?很多人都会犯这个错误!...
- 还在担心没有服务器做不了数据分析?这个免费资源看一下!
- 班志杰内蒙古大学计算机学院,内蒙古大学计算机学院研究生导师简介-班志杰(博士)...
- JSP+Servlet--简易的博客功能开发
- LaTeX排版软件安装包及安装方法(texlive + TeXstudio)
- 解析小型机、大型机和PC服务器间的差别
- mysql中rpl_MySQL半同步复制之rpl_semi_sync_master_wait_point
- 建网站怎么选合适的网站模版
- EPMS- 让企业应用更加轻便!
- 随机点名册的简单程序
- python去重、根据某列统计另一列频数
- 红月之特装数据(转自官方)
- 如何区分哲学中的世界观和方法论
- 将日期转换成上中下旬
- 神仙级python入门教程(非常详细),从零基础入门到精通,建议收藏!
- 【Java】线程程序计数器
- 284、一个宽带如何装两个路由器?这三种方法都可以使用
- 漫漫人生录 | 程序员成年后最大的自律,是克制自己去纠正别人的欲望
热门文章
- AJAX框架衣柜收纳技巧,如何收纳整理衣服方便省事又不会乱——一用就爱上的衣柜整理法...
- 货车etc怎么免费办理?网上免费申请办理货车etc高速通行卡流程方法
- 鸿蒙归蝶的反弹,《诛仙2》蒙鸿试炼副本详细攻略
- 【JQuery】JQuery使用——网页作业
- python手机运行器_MobileNet教程:用TensorFlow搭建在手机上运行的图像分类器
- 连接mysql数据库字符串_MySQL数据库中怎么将字符串连接操作
- 查看计算机计划,处理器计划,手把手教你电脑处理器怎么查看
- 高效文本处理三剑客之一【grep】
- javaScript动态添加Li元素
- 五大PS图层使用技巧,图层还可以这样玩?