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 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
python字典get()方法用法分析
Apr 17 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Python标准库之collections包的使用教程
Apr 27 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
详解Python 调用C# dll库最简方法
Jun 20 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
详解Python中import机制
Sep 11 Python
Python import模块的缓存问题解决方案
Jun 02 Python
教你使用TensorFlow2识别验证码
Jun 11 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数据库实现无限分类的方法
2014/12/12 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
js取得url地址参数实例
2013/02/22 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
vuex的数据渲染与修改浅析
2020/11/26 Vue.js
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python如何制作英文字典
2019/06/25 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
pycharm专业版远程登录服务器的详细教程
2020/09/15 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
儿科护士自我鉴定
2013/10/14 职场文书
公司财务工作总结的自我评价
2013/11/23 职场文书
自主实习接收函
2014/01/13 职场文书
授权委托书
2014/09/17 职场文书
商品陈列协议书
2014/09/29 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书