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采集博客中上传的QQ截图文件
Jul 18 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Python语言的变量认识及操作方法
Feb 11 Python
Python对切片命名的实现方法
Oct 16 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
python将数组n等分的实例
Dec 02 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
python 获取字典特定值对应的键的实现
Sep 29 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 APC的安装与使用详解
2013/06/13 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
IE bug table元素的innerHTML
2010/01/11 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
详解webpack的proxyTable无效的解决方案
2018/06/15 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
前端路由&webpack基础配置详解
2019/06/10 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python中Apriori算法实现讲解
2017/12/10 Python
pandas多级分组实现排序的方法
2018/04/20 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
课堂教学改革实施方案
2014/03/17 职场文书
村官个人总结范文
2015/03/03 职场文书
今日说法观后感
2015/06/08 职场文书