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获取文件扩展名的方法
Jul 06 Python
Python实现一个简单的验证码程序
Nov 03 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python脚本完成post接口测试的实例
Dec 17 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
详解js文件通过python访问数据库方法
Mar 03 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
python制作微博图片爬取工具
Jan 16 Python
python cv2图像质量压缩的算法示例
Jun 04 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函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
Python过滤txt文件内重复内容的方法
2018/10/21 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
使用Python封装excel操作指南
2021/01/29 Python
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
五年级音乐教学反思
2014/02/06 职场文书
财产公证书格式
2014/04/10 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
个人政治思想总结
2015/03/05 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Python Pandas解析读写 CSV 文件
2022/04/11 Python
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers