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基础教程之匿名函数lambda
Jan 17 Python
python爬虫_自动获取seebug的poc实例
Aug 05 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python购物车程序简单代码
Apr 18 Python
如何用Python实现简单的Markdown转换器
Jul 16 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
利用python 下载bilibili视频
Nov 13 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 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学习之PHP表达式
2006/10/09 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
jQuery实现简单滚动动画效果
2016/04/07 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
React Router基础使用
2017/01/17 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
全面理解Python中self的用法
2016/06/04 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
我爱读书演讲稿
2014/05/07 职场文书
三潭印月的导游词
2015/02/12 职场文书
罚款通知怎么写
2015/04/22 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
导游词之无锡古运河
2019/11/14 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis