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内置数据类型详解
Aug 18 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Python3实现Web网页图片下载
Jan 28 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
Python根据成绩分析系统浅析
Feb 11 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
python super的使用方法及实例详解
Sep 25 Python
使用python动态生成波形曲线的实现
Dec 04 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
Python语言内置数据类型
Feb 24 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+SQLite存储方案
2010/09/04 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
BootstrapTable请求数据时设置超时(timeout)的方法
2017/01/22 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
解决React Native端口号修改的方法
2017/07/28 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
python 字符串格式化代码
2013/03/17 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
python生成密码字典的方法
2018/07/06 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
美国百货齐全的精品网站,提供美式风格的产品:Overstock.com
2016/07/22 全球购物
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
现代化办公人员工作的自我评价
2013/10/16 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android