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列表操作之extend和append的区别实例分析
Jul 28 Python
python微信公众号开发简单流程
Mar 23 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
python和opencv实现抠图
Jul 18 Python
django admin后台添加导出excel功能示例代码
May 15 Python
python图像和办公文档处理总结
May 28 Python
详解Python 切片语法
Jun 10 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 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根据操作系统转换文件名大小写的方法
2014/02/24 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
python3实现短网址和数字相互转换的方法
2015/04/28 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
用Python写冒泡排序代码
2016/04/12 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
Python实现数值积分方式
2019/11/20 Python
Python 发送邮件方法总结
2020/08/10 Python
Python logging模块原理解析及应用
2020/08/13 Python
编写python代码实现简单抽奖器
2020/10/20 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
《会走路的树》教后反思
2014/04/19 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python