python实现简单聊天室功能 可以私聊

 更新时间:2019年07月12日 14:45:20   作者:日天达人   我要评论
这篇文章主要为大家详细介绍了python实现简单聊天室功能,可以进行私聊,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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)

运行代码截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持澳门金沙网上娱乐。

相关文章

  • pandas进行数据的交集与并集方式的数据合并方法

    pandas进行数据的交集与并集方式的数据合并方法

    今天小编就为大家分享一篇pandas进行数据的交集与并集方式的数据合并方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现简单聊天应用 python群聊和点对点均实现

    python实现简单聊天应用 python群聊和点对点均实现

    这篇文章主要为大家详细介绍了python实现简单聊天应用,python群聊和点对点均实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Python面向对象特殊成员

    Python面向对象特殊成员

    这篇文章主要介绍了Python面向对象特殊成员的相关资料,需要的朋友可以参考下
    2017-04-04
  • python中pass语句用法实例分析

    python中pass语句用法实例分析

    这篇文章主要介绍了python中pass语句用法,对比C++程序实例分析了pass语句的使用方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 在Python中实现替换字符串中的子串的示例

    在Python中实现替换字符串中的子串的示例

    今天小编就为大家分享一篇在Python中实现替换字符串中的子串的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python 列表(List)操作方法详解

    Python 列表(List)操作方法详解

    这篇文章主要介绍了Python中列表(List)的详解操作方法,包含创建、访问、更新、删除、其它操作等,需要的朋友可以参考下
    2014-03-03
  • Python中文件操作简明介绍

    Python中文件操作简明介绍

    这篇文章主要介绍了Python中文件操作简明介绍,本文讲解了打开文件、读取方法、写入方法、文件内移动、文件迭代、关闭文件、截取文件等内容,并给出了一个完整操作实例,需要的朋友可以参考下
    2015-04-04
  • python中遍历文件的3个方法

    python中遍历文件的3个方法

    这篇文章主要介绍了python中遍历文件的3个方法,本文分别使用os.path.walk()、os.walk()、os.listdir()来实现,需要的朋友可以参考下
    2014-09-09
  • 使用Django连接Mysql金沙国际官网步骤

    使用Django连接Mysql金沙国际官网步骤

    今天小编就为大家分享一篇关于使用Django连接Mysql金沙国际官网步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • pygame学习笔记(5):游戏精灵

    pygame学习笔记(5):游戏精灵

    这篇文章主要介绍了pygame学习笔记(5):游戏精灵,本文讲解了什么是精灵、sprite中主要且常用的变量、建立一个简单的精灵、学习精灵组、动画等内容,需要的朋友可以参考下
    2015-04-04

最新评论