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 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 Python
Python生成随机验证码的两种方法
Dec 22 Python
Python 性能优化技巧总结
Nov 01 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
pandas中去除指定字符的实例
May 18 Python
基于pip install django失败时的解决方法
Jun 12 Python
django session完成状态保持的方法
Nov 27 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
python中threading开启关闭线程操作
May 02 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 Python
Pytorch 中的optimizer使用说明
Mar 03 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
Symfony控制层深入详解
2016/03/17 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
javascript多行字符串的简单实现方式
2015/05/04 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
iView框架问题整理小结
2018/10/16 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
wxPython中文教程入门实例
2014/06/09 Python
django 将model转换为字典的方法示例
2018/10/16 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python基于win32api实现键盘输入
2020/12/09 Python
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
优秀团队获奖感言
2014/02/19 职场文书
教师自我鉴定范文
2014/03/20 职场文书
驾驶员安全责任书
2014/07/22 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
碧霞祠导游词
2015/02/09 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
大学生十八大感想
2015/08/11 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
分析Python list操作为什么会错误
2021/11/17 Python
springboot入门 之profile设置方式
2022/04/04 Java/Android