python实现简单点对点(p2p)聊天


Posted in Python onSeptember 13, 2017

点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages),这样当信息发送到服务器之后服务器根据to的连接对象遍历连接列表找到目标对象将信息发送给目标,目标拿到信息后就知道是谁发过来的,然后根据id号码进行回复。此实现将会继续完善,后续新加功能将会在我个人github主页展现

服务器端实现:

#coding:utf-8
'''
file:server.py
date:2017/9/10 12:43
author:lockey
email:lockey@123.com
platform:win7.x86_64 pycharm python3
desc:p2p communication serverside
'''
import socketserver,json
import subprocess

connLst = []
## 连接列表,用来保存一个连接的信息(代号 地址和端口 连接对象)
class Connector(object):#连接对象类
 def __init__(self,account,password,addrPort,conObj):
 self.account = account
 self.password = password
 self.addrPort = addrPort
 self.conObj = conObj


class MyServer(socketserver.BaseRequestHandler):

 def handle(self):
 print("got connection from",self.client_address)
 register = False
 while True:
  conn = self.request
  data = conn.recv(1024)
  if not data:
  continue
  dataobj = json.loads(data.decode('utf-8'))
  #如果连接客户端发送过来的信息格式是一个列表且注册标识为False时进行用户注册
  if type(dataobj) == list and not register:
  account = dataobj[0]
  password = dataobj[1]
  conObj = Connector(account,password,self.client_address,self.request)
  connLst.append(conObj)
  register = True
  continue
  print(connLst)
  #如果目标客户端在发送数据给目标客服端
  if len(connLst) > 1 and type(dataobj) == dict:
  sendok = False
  for obj in connLst:
   if dataobj['to'] == obj.account:
   obj.conObj.sendall(data)
   sendok = True
  if sendok == False:
   print('no target valid!')
  else:
  conn.sendall('nobody recevied!'.encode('utf-8'))
  continue

if __name__ == '__main__':
 server = socketserver.ThreadingTCPServer(('192.168.1.4',8022),MyServer)
 print('waiting for connection...')
 server.serve_forever()

客户端实现:

#coding:utf-8
'''
file:client.py.py
date:2017/9/10 11:01
author:lockey
email:lockey@123.com
platform:win7.x86_64 pycharm python3
desc:p2p communication clientside
'''
from socket import *
import threading,sys,json,re

HOST = '192.168.1.4' ##
PORT=8022
BUFSIZ = 1024 ##缓冲区大小 1K
ADDR = (HOST,PORT)

tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
userAccount = None
def register():
 myre = r"^[_a-zA-Z]\w{0,}"
 #正则验证用户名是否合乎规范
 accout = input('Please input your account: ')
 if not re.findall(myre, accout):
 print('Account illegal!')
 return None
 password1 = input('Please input your password: ')
 password2 = input('Please confirm your password: ')
 if not (password1 and password1 == password2):
 print('Password not illegal!')
 return None
 global userAccount
 userAccount = accout
 return (accout,password1)

class inputdata(threading.Thread):
 def run(self):
 while True:
  sendto = input('to>>:')
  msg = input('msg>>:')
  dataObj = {'to':sendto,'msg':msg,'froms':userAccount}
  datastr = json.dumps(dataObj)
  tcpCliSock.send(datastr.encode('utf-8'))


class getdata(threading.Thread):
 def run(self):
 while True:
  data = tcpCliSock.recv(BUFSIZ)
  dataObj = json.loads(data.decode('utf-8'))
  print('{} -> {}'.format(dataObj['froms'],dataObj['msg']))


def main():
 while True:
 regInfo = register()
 if regInfo:
  datastr = json.dumps(regInfo)
  tcpCliSock.send(datastr.encode('utf-8'))
  break
 myinputd = inputdata()
 mygetdata = getdata()
 myinputd.start()
 mygetdata.start()
 myinputd.join()
 mygetdata.join()


if __name__ == '__main__':
 main()

运行结果示例:

服务器端结果:

python实现简单点对点(p2p)聊天

客户端1:

python实现简单点对点(p2p)聊天 

客户端2:

python实现简单点对点(p2p)聊天 

客户端3:

python实现简单点对点(p2p)聊天

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中dir函数用法分析
Apr 17 Python
Python实现把数字转换成中文
Jun 29 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
python如何爬取个性签名
Jun 19 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
numpy求平均值的维度设定的例子
Aug 24 Python
tensorflow模型转ncnn的操作方式
May 25 Python
Django 如何实现文件上传下载
Apr 08 Python
django 常用orm操作详解
Sep 13 #Python
Python三级菜单的实例
Sep 13 #Python
基于Python代码编辑器的选用(详解)
Sep 13 #Python
python多线程socket编程之多客户端接入
Sep 12 #Python
python数据结构之链表详解
Sep 12 #Python
Python数据结构之单链表详解
Sep 12 #Python
python处理Excel xlrd的简单使用
Sep 12 #Python
You might like
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
2020/12/19 Vue.js
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
学习python的几条建议分享
2013/02/10 Python
浅析Python编写函数装饰器
2016/03/18 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
python学生管理系统代码实现
2020/04/05 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python判断完全平方数的方法
2018/11/13 Python
opencv与numpy的图像基本操作
2019/03/08 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Python如何在单元测试中给对象打补丁
2020/08/03 Python
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
办公室员工岗位工作职责
2014/03/10 职场文书
聚美优品励志广告词
2014/03/14 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
群众路线专项整治方案
2014/10/27 职场文书
学生评语集锦
2015/01/04 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
javascript的setTimeout()使用方法总结
2021/11/20 Javascript