时间:2021-05-22
点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages),这样当信息发送到服务器之后服务器根据to的连接对象遍历连接列表找到目标对象将信息发送给目标,目标拿到信息后就知道是谁发过来的,然后根据id号码进行回复。此实现将会继续完善,后续新加功能将会在我个人github主页展现
服务器端实现:
#coding:utf-8'''file:server.pydate:2017/9/10 12:43author:lockeyemail:lockey@123.complatform: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:lockey@123.complatform: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:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
p2p终结者怎么用p2p终结者如何控制网速p2p终结者怎么用p2p终结者如何控制网速p2p终结者怎么用p2p终结者如何控制网速p2p终结者怎么用p2p终结者如何
12月3日消息,近日巴西央行行长RobertoCamposNeto透露,Facebook旗下WhatsApp将于短期内,在当地推出点对点(P2P)支付服务。《》
p2p网站建设制作怎样建,P2P网络借贷平台,是p2p借贷与网络借贷相结合的金融服务网站。p2p借贷是peertopeerlending的缩写,peer是个人的
P2P终结者国内目前首套专门针对网络P2P滥用问题开发的系统软件,可以实现对局域网全网主机的P2P下载控制,只需要一机安装,就可以控制全网,非常易于部署,可保证
SERDES是英文SERializer(串行器)/DESerializer(解串器)的简称。它是一种主流的时分多路复用(TDM)、点对点(P2P)的串行通信技术