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写入mysql中datetime类型遇到的问题
Jun 21 Python
Python 字符串与数字输出方法
Jul 16 Python
Flask之flask-session的具体使用
Jul 26 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
详解django自定义中间件处理
Nov 21 Python
python程序变成软件的实操方法
Jun 24 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
python如何求100以内的素数
May 27 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP简单遍历对象示例
2016/09/28 PHP
新页面打开实际尺寸的图片
2006/08/25 Javascript
js字符编码函数区别分析
2008/06/05 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python数据库小程序源代码
2019/09/15 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
小班下学期评语
2014/05/04 职场文书