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中使用AOP实现Redis缓存示例
Jul 11 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
Python中按键来获取指定的值
Mar 02 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
基于Django统计博客文章阅读量
Oct 29 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python生成九宫格图片的示例代码
Apr 14 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
深入浅析javascript继承体系
2017/10/23 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Python之re操作方法(详解)
2017/06/14 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python实现kmp算法的实例代码
2019/04/03 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python retrying模块的使用方法详解
2019/09/25 Python
python常用运维脚本实例小结
2020/02/14 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
海外淘书首选:AbeBooks
2017/07/31 全球购物
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
我的梦想演讲稿
2014/04/30 职场文书
关于建议书的格式范文
2014/05/20 职场文书
写给老师的感谢信
2015/01/20 职场文书
Python中22个万用公式的小结
2021/07/21 Python
Golang 并发下的问题定位及解决方案
2022/03/16 Golang