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简单实现旋转图片的方法
May 30 Python
一张图带我们入门Python基础教程
Feb 05 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
Python 文件操作的详解及实例
Sep 18 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
pycharm 取消默认的右击运行unittest的方法
Nov 29 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python-xpath获取html文档的部分内容
Mar 06 Python
python实现图片九宫格分割的示例
Apr 25 Python
Python List remove()实例用法详解
Aug 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
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
python中lambda()的用法
2017/11/16 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
2020/07/14 Python
十佳大学生事迹材料
2014/01/29 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
期中考试后的反思
2014/02/08 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
求职自我评价范文100字
2014/09/23 职场文书
贷款承诺书
2015/01/20 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
文明礼仪主题班会
2015/08/13 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书
Python anaconda安装库命令详解
2021/10/16 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL