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编写分析Python程序性能的工具的教程
Apr 01 Python
Python多线程编程简单介绍
Apr 13 Python
python装饰器初探(推荐)
Jul 21 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
Python编程中flask的简介与简单使用
Dec 28 Python
python字符串的拼接方法总结
Nov 18 Python
Python yield生成器和return对比代码实例
Apr 20 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
flask开启多线程的具体方法
Aug 02 Python
python 基于opencv去除图片阴影
Jan 26 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
Python学习之迭代器详解
Apr 01 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面向对象的方法重载两种版本比较
2008/09/08 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
php如何连接sql server
2015/10/16 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
angular十大常见问题
2017/03/07 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
2018/11/25 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
python使用turtle库绘制时钟
2020/03/25 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
中专生自我鉴定
2013/12/17 职场文书
运动会通讯稿400字
2014/01/28 职场文书
建议书范文
2015/02/05 职场文书
工程部主管岗位职责
2015/02/12 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python