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编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
python根据url地址下载小文件的实例
Dec 18 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
jupyter notebook 多行输出实例
Apr 09 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
Python控制鼠标键盘代码实例
Dec 08 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP程序员编程注意事项
2008/04/10 PHP
php输出xml格式字符串(用的这个)
2012/07/12 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python实现在线翻译
2020/06/18 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
历史系自荐信范文
2013/12/24 职场文书
工程资料员岗位职责
2014/03/10 职场文书
家长学校实施方案
2014/03/15 职场文书
授权委托书(完整版)
2014/09/10 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
爱的承诺书
2015/01/20 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
白银帝国观后感
2015/06/17 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
新员工入职感想
2015/08/07 职场文书
高一英语教学反思
2016/03/03 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
八年级作文之友谊
2019/12/02 职场文书
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫