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 字符串格式化代码
Mar 17 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
python list元素为tuple时的排序方法
Apr 18 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
Python中正则表达式的用法总结
Feb 22 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python序列类型种类详解
Feb 26 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
python 基于Apscheduler实现定时任务
Dec 15 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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
vue实现拖拽效果
2019/12/23 Javascript
js实现简单进度条效果
2020/03/25 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python读写unicode文件的方法
2015/07/10 Python
python实现决策树
2017/12/21 Python
Python格式化输出%s和%d
2018/05/07 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
区域总监的岗位职责
2013/11/21 职场文书
大学军训感言1000字
2014/02/25 职场文书
环保项目建议书
2014/08/26 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
MySQL分区路径子分区再分区
2022/04/13 MySQL