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封装shell命令实例分析
May 05 Python
python添加模块搜索路径方法
Sep 11 Python
python实现八大排序算法(1)
Sep 14 Python
Django实现组合搜索的方法示例
Jan 23 Python
Python实现的个人所得税计算器示例
Jun 01 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python如何实现的二分查找算法
May 27 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 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 intval与mysql的int取值范围不同
2010/12/12 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
iview form清除校验状态的实现
2019/09/19 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
int在python中的含义以及用法
2019/06/27 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
通信工程专业毕业生推荐信
2013/12/25 职场文书
运动会通讯稿100字
2014/01/31 职场文书
初中语文教学反思
2014/02/02 职场文书
体育教师自我鉴定
2014/02/12 职场文书
美术教师岗位职责
2014/03/18 职场文书
合作意向协议书
2015/01/29 职场文书
中标通知书格式
2015/04/17 职场文书
观后感的写法
2015/06/19 职场文书
自信主题班会
2015/08/14 职场文书