这里有新鲜出炉的Python3 Cookbook中文版,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
这篇文章主要为大家详细介绍了python实现简单点对点p2p聊天,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(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()
运行结果示例:
服务器端结果:
客户端1:
客户端2:
客户端3:
来源: http://www.phperz.com/article/17/1027/350884.html