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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python实现百度关键词排名查询
Mar 30 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python中fnmatch模块的使用详情
Nov 30 Python
pytorch自定义初始化权重的方法
Aug 17 Python
学Python 3的理由和必要性
Nov 19 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python-opencv 双线性插值实例
Jan 17 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 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实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
ES6学习教程之对象字面量详解
2017/10/09 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
Python聚类算法之基本K均值实例详解
2015/11/20 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
浅谈Python 参数与变量
2020/06/20 Python
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
医院门卫岗位职责
2013/12/30 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
《忆江南》教学反思
2014/04/07 职场文书
经管应届生求职信范文
2014/05/18 职场文书
推广普通话演讲稿
2014/05/23 职场文书
分公司任命书
2014/06/06 职场文书
学生安全责任书模板
2014/07/25 职场文书
法定代表人授权委托书
2014/09/19 职场文书
幼儿园感谢信
2015/01/21 职场文书
2016年社区综治宣传月活动总结
2016/03/16 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
Windows server 2022创建创建林、域树、子域的步骤
2022/06/25 Servers