• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python点对点简单实现

python 搞代码 4年前 (2022-01-09) 16次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了python实现简单点对点p2p聊天,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具

本文来源gao!%daima.com搞$代*!码网1

有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages),这样当信息发送到服务器之后服务器根据to的连接对象遍历连接列表找到目标对象将信息发送给目标,目标拿到信息后就知道是谁发过来的,然后根据id号码进行回复。此实现将会继续完善,后续新加功能将会在我个人github主页展现

服务器端实现:

#coding:utf-8'''file:server.pydate:2017/9/10 12:43author:lockeyemail:[email protected]:win7.x86_64 pycharm python3desc:p2p communication serverside'''import socketserver,jsonimport subprocessconnLst = []## 连接列表,用来保存一个连接的信息(代号 地址和端口 连接对象)class Connector(object):#连接对象类 def __init__(self,account,password,addrPort,conObj): self.account = account self.password = password self.addrPort = addrPort self.conObj = conObjclass 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'))  continueif __name__ == '__main__': server = socketserver.ThreadingTCPServer(('192.168.1.4',8022),MyServer) print('waiting for connection...') server.serve_forever()

客户端实现:

#coding:utf-8'''file:client.py.pydate:2017/9/10 11:01author:lockeyemail:[email protected]:win7.x86_64 pycharm python3desc:p2p communication clientside'''from socket import *import threading,sys,json,reHOST = '192.168.1.4' ##PORT=8022BUFSIZ = 1024 ##缓冲区大小 1KADDR = (HOST,PORT)tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)userAccount = Nonedef 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:

以上就是python点对点简单实现的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python点对点简单实现

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址