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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
python笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python实现视频下载功能
Mar 14 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
python对excel文档去重及求和的实例
Apr 18 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
Oct 21 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
python线程的几种创建方式详解
Aug 29 Python
python plotly画柱状图代码实例
Dec 13 Python
用python绘制樱花树
Oct 09 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 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
一个目录遍历函数
2006/10/09 PHP
基于mysql的论坛(6)
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
js数组的操作指南
2014/12/28 Javascript
Jquery 实现checkbox全选方法
2015/01/28 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
JavaScript实现简单轮播图效果
2018/12/01 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
python多进程实现进程间通信实例
2017/11/24 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
Python jieba库分词模式实例用法
2021/01/13 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
关于VPN
2012/06/10 面试题
船舶专业个人求职信范文
2014/01/02 职场文书
成龙洗发水广告词
2014/03/14 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
教学质量月活动总结
2015/05/11 职场文书
初一英语教学反思
2016/02/15 职场文书
python 进阶学习之python装饰器小结
2021/09/04 Python