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基础教程之循环介绍
Aug 29 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
解决Mac安装scrapy失败的问题
Jun 13 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
pandas取出重复数据的方法
Jul 04 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python 调试冷知识(小结)
Nov 11 Python
如何给Python代码进行加密
Jan 10 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
详解Python openpyxl库的基本应用
Feb 26 Python
Python 数据可视化之Bokeh详解
Nov 02 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
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHP运行模式汇总
2016/11/06 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
React实现轮播效果
2020/08/25 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
python交换两个变量的值方法
2019/01/12 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
计算机专业职业规划
2014/02/28 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
中班上学期个人总结
2015/02/12 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL