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 相关文章推荐
Django框架下在视图中使用模版的方法
Jul 16 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
Python实现的特征提取操作示例
Dec 03 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
python解析多层json操作示例
Dec 30 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
Python class的继承方法代码实例
Feb 14 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
Python中快速掌握Data Frame的常用操作
Mar 31 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
深入php多态的实现详解
2013/06/09 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
sqlalchemy对象转dict的示例
2014/04/22 Python
Python3基础之条件与循环控制实例解析
2014/08/13 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
python爬虫超时的处理的实例
2018/12/19 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
解决python replace函数替换无效问题
2020/01/18 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
新闻编辑自荐信
2013/11/03 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
有趣的广告词
2014/03/18 职场文书
工程管理英文求职信
2014/03/18 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
政工例会汇报材料
2014/08/26 职场文书
2015年中个人总结范文
2015/03/10 职场文书
上下班时间调整通知
2015/04/23 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
SQL Server使用导出向导功能
2022/04/08 SQL Server