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解析文件示例
Jan 23 Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
Python利用IPython提高开发效率
Aug 10 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
python正则表达式之对号入座篇
Jul 24 Python
python求质数的3种方法
Sep 28 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 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
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python socket编程实例详解
2015/05/27 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python 如何调用 dubbo 接口
2020/09/24 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
事业单位接收函
2014/01/10 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
重阳节主题班会
2015/08/17 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
Go Plugins插件的实现方式
2021/08/07 Golang