python实现简单聊天室功能 可以私聊


Posted in Python onJuly 12, 2019

本文实例为大家分享了python实现简单聊天室功能的具体代码,供大家参考,具体内容如下

公共模块

首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在公共类中进行了异常处理

import socket,struct,json
def send_dic(c,dic):
 dic_json=json.dumps(dic)
 dic_json_length=len(dic_json.encode('utf-8'))
 struct_dic_json_length=struct.pack('q',dic_json_length)
 c.send(struct_dic_json_length)
 c.send(dic_json.encode('utf-8'))
def get_dic(c):
 try:
  dic_length=struct.unpack('q',c.recv(8))[0]
 except:
  return {'msg':'exit'}
 try:
  dic_json=c.recv(dic_length).decode('utf-8')
 except:
  return {'msg':'exit'}
 dic=json.loads(dic_json)
 return dic

服务器端

import socket
from concurrent.futures import ThreadPoolExecutor
import lib.common #导入写在lib里面的公共模块,代码在上面
import re
#进行开启服务器等一系列操作
s=socket.socket()
ip_host=('127.0.0.1',8000)
s.bind(ip_host)
s.listen()
#创建一个列表,用来保存客户端及其信息
c_list=[]
def get_send_msg(c,addr,c_list):
 while True:
  tag=False
  dic=lib.common.get_dic(c)
  if dic['msg']=='exit':
   #如果接受出异常,或是客户端主动输入为exit,在列表中移除客户端信息
   for i in c_list:
    if i['addr']==addr:
     c_list.remove(i)
   break
  if dic['is_siliao']==True:
   #客户端发来的字典里面如果is_siliao==True,进入私聊代码
   for i in c_list:
    #遍历列表,并用正则表达式截取信息
    li=re.findall('(.*?)@%s(.*)'%i['name'],dic['msg'])
    if len(li)!=0:
     dic['msg']=li[0][0]+li[0][1]
     lib.common.send_dic(i['client'],dic)
     tag=True
     break
  if tag:
   continue
  #如果不是私聊,进入下面代码,在聊天室进行群聊
  for i in c_list:
   if i['addr']!=addr:
    lib.common.send_dic(i['client'],dic)
while True:
 #用线程池,进行多次连接
 print('客户端等待连接')
 c,addr=s.accept()
 print('%s连接了服务器'%addr[1])
 name=c.recv(1024).decode('utf-8')#进行第一次接受,接受客户端的名字,为私聊的功能做准备
 c_dic={'addr':addr,'client':c,'name':name}#将客户端的信息保存在字典中
 c_list.append(c_dic)#将字典加入列表
 t=ThreadPoolExecutor()
 t.submit(get_send_msg,c,addr,c_list)

客户端:

import lib.common
from concurrent.futures import ThreadPoolExecutor
c=socket.socket()
ip_host=('127.0.0.1',8000)
c.connect(ip_host)
def send_msg(c,name):
 while True:
  msg = input ('>>:').strip ()
  is_siliao=False
  if not msg:
   continue
  # if msg.startswith('@'):
  if '@'in msg:
   is_siliao=True
  dic = {'msg': msg,'name':name,'is_siliao':is_siliao}
  lib.common.send_dic(c,dic)
  if msg=='exit':
   c.close ()
   break
def get_msg(c):
 while True:
  dic=lib.common.get_dic(c)
  if dic['is_siliao']==True:
   print('来自%s的私聊:%s'%(dic['name'],dic['msg']))
   continue
  print('%s:%s'%(dic['name'],dic['msg']))
t=ThreadPoolExecutor()
name=input('你的聊天名字:').strip()
c.send(name.encode('utf-8'))
t.submit(send_msg,c,name)
t.submit(get_msg,c)

运行代码截图:

python实现简单聊天室功能 可以私聊

python实现简单聊天室功能 可以私聊

python实现简单聊天室功能 可以私聊

python实现简单聊天室功能 可以私聊

python实现简单聊天室功能 可以私聊

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Python闭包的两个注意事项(推荐)
Mar 20 Python
python读取excel表格生成erlang数据
Aug 26 Python
微信跳一跳自动运行python脚本
Jan 08 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
Python玩转Excel的读写改实例
Feb 22 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python微信公众号开发简单流程实现
Mar 09 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
pyinstaller参数介绍以及总结详解
Jul 12 #Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 #Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 #Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 #Python
Django中celery执行任务结果的保存方法
Jul 12 #Python
python hough变换检测直线的实现方法
Jul 12 #Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 #Python
You might like
S900/ ETON E1-XM 收音机
2021/03/02 无线电
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
js中运算符&& 和 || 的使用记录
2014/08/21 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python中partial()基础用法说明
2018/12/30 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python类中super() 的使用解析
2019/12/19 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
中学教师请假制度
2014/02/03 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
会计实训总结范文
2015/08/03 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
2022微信温控新功能上线
2022/05/09 数码科技