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批量同步web服务器代码核心程序
Sep 01 Python
Python随机生成彩票号码的方法
Mar 05 Python
解析Python编程中的包结构
Oct 25 Python
Python文件处理
Feb 29 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
python 实现识别图片上的数字
Jul 30 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 Python
Python中如何处理常见报错
Jan 18 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
js解决movebox移动问题
2016/03/29 Javascript
JavaScript表单验证实现代码
2017/05/22 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
python获得图片base64编码示例
2014/01/16 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
快速了解python leveldb
2018/01/18 Python
浅谈Django的缓存机制
2018/08/23 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Python常见数字运算操作实例小结
2019/03/22 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
《在家里》教后反思
2014/03/01 职场文书
小学班主任事迹材料
2014/12/17 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
通用员工手册范本
2015/05/14 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL