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 相关文章推荐
简单介绍Ruby中的CGI编程
Apr 10 Python
python绘图方法实例入门
May 19 Python
Python3.6简单反射操作示例
Jun 14 Python
python队列原理及实现方法示例
Nov 27 Python
kafka-python 获取topic lag值方式
Dec 23 Python
Django 批量插入数据的实现方法
Jan 12 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python可迭代对象去重实例
May 15 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
法律进学校实施方案
2014/03/15 职场文书
2014年社区居委会主任重阳节讲话稿
2014/09/25 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
未婚证明格式
2015/06/15 职场文书
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers