一,语言
使用python,进行socket编程。
二,整体框架与流程
一个tracker服务器
trackerServer1.0.py
三个参与洪流的客户端
客户端有二部分组成:用于请求的客户端,和用于服务其他客户端的服务端
它们分别是:client1.x.py和clientServer1.x.py
流程
这里只是对BT进行模拟展示,所以流程比较简单。
1,启动tracker服务器
tracker服务器用于存储洪流中客户端持有的文件信息。启动后等待客户端的连接。
2,启动客户端
先启动客户端的服务部分,本来启动后它应该先去请求tracker服务器加入洪流并在后续发送自己持有的文件的哈希值,但此处简化为tracker服务器预先存储了客户端持有的文件信息。即,在此次模拟中服务部分只负责响应其他客户端的请求。
再启动客户端,向tracker服务器请求文件,服务器返回文件存储位置,客户端根据服务器返回的位置信息再去向其他客户端请求数据。
备注
正如前文所写,本次只是一个简单的模拟,所以可传输的文件也被写死了,只能是X.jpg 且X={1,2,3,4}
三,源代码
一,tracker服务器
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file trackerServer1.0.py
import socket
class trackerServer(object) :
# 创建 socket 对象
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
jpgLists = [[],[1,2],[1],[3],[1]]
ipList = [[('10.31.71.216',50011),('10.31.71.216',50012),('10.31.71.216',50013)],
('10.31.71.216',50021),('10.31.71.216',50022),('10.31.71.216',50023)]
def initerSocket(self):
host = socket.gethostname()
port = 8808
# 绑定端口号
self.serverSocket.bind((host, port))
# 设置最大连接数,超过后排队
self.serverSocket.listen(10)
def runServer(self):
while True:
# 1,等待客户端的连接
# 建立客户端连接 accept()阻塞式等待连接
clientSocket, addr = self.serverSocket.accept()
print("连接地址: %s" % str(addr))
# 2,接收并处理客户端请求
msg = clientSocket.recv(1024)
idList = self.jpgLists[int(msg.decode("utf-8"))]
msgre = ""
for i in idList:
msgre = msgre + str(self.ipList[i])
# 3,响应资源地址 更新Tracker服务器
clientSocket.send(msgre.encode('utf-8'))
print("已响应")
clientSocket.close()
print("连接关闭")
self.jpgLists[int(msg.decode("utf-8"))] = self.jpgLists[int(msg.decode("utf-8"))] + [int(str(addr)[-2])]
T = trackerServer()
T.initerSocket()
T.runServer()
二,client
以下为client1.0.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file client1.0.py
import socket
class client(object):
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
self.host = socket.gethostname()
self.port = 50011
# 绑定端口号
self.s.bind((self.host, self.port))
def requireServer(self,name):
# 1,与Tracker服务器获取连接
self.s.connect((self.host,8808))
print("Tracker服务器连接成功!")
# 2,向Tracker服务器发送请求信息
self.s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 3,接收到来自Tracker的响应 关闭连接
# 接收小于 1024 字节的数据 接受1.jpg
msg = self.s.recv(1024)
print("响应:" + msg.decode('utf-8'))
self.s.close()
print("Tracker服务器连接关闭")
# 4,通过Tracker的响应来请求需要下载的文件
# 4.1,连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
portc = int(msg.decode("utf-8")[17:22])
s.connect((self.host, portc))
print("Client服务器连接成功!")
# 4.2,请求
s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 4.3,接收
msg = s.recv(1024)
print("响应:" + msg.decode('utf-8'))
s.close()
print("Client服务器连接关闭")
# 4.4,存储
w = open("client1/" + name + ".jpg","w")
w.write(msg.decode("utf-8"))
C = client()
C.initerSocket()
C.requireServer("1")
以下为clientServer1.0.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file clientServer1.0.py
import socket
class clientServer(object):
# 创建 socket 对象
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
host = socket.gethostname()
port = 50021
# 绑定端口号
self.serverSocket.bind((host, port))
# 设置最大连接数,超过后排队
self.serverSocket.listen(10)
def runServer(self):
while True:
# 1,等待客户端的连接
# 建立客户端连接 accept()阻塞式等待连接
clientSocket, addr = self.serverSocket.accept()
print("连接地址: %s" % str(addr))
# 2,接收并处理客户端请求
msg = clientSocket.recv(1024)
# 3,响应资源
r = open("client1/" + msg.decode("utf-8") + ".jpg",'r')
s = str(r)
r.close()
clientSocket.send(s.encode("utf-8"))
print("已响应")
clientSocket.close()
print("连接关闭")
C = clientServer()
C.initerSocket()
C.runServer()
以下为client1.1.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file client1.1.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file client1.0.py
import socket
class client(object):
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
self.host = socket.gethostname()
self.port = 50012
# 绑定端口号
self.s.bind((self.host, self.port))
def requireServer(self,name):
# 1,与Tracker服务器获取连接
self.s.connect((self.host,8808))
print("Tracker服务器连接成功!")
# 2,向Tracker服务器发送请求信息
self.s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 3,接收到来自Tracker的响应 关闭连接
# 接收小于 1024 字节的数据 接受1.jpg
msg = self.s.recv(1024)
print("响应:" + msg.decode('utf-8'))
self.s.close()
print("Tracker服务器连接关闭")
# 4,通过Tracker的响应来请求需要下载的文件
# 4.1,连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
portc = int(msg.decode("utf-8")[17:22])
s.connect((self.host, portc))
print("Client服务器连接成功!")
# 4.2,请求
s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 4.3,接收
msg = s.recv(1024)
print("响应:" + msg.decode('utf-8'))
s.close()
print("Client服务器连接关闭")
# 4.4,存储
w = open("client2/" + name + ".jpg", "w")
w.write(msg.decode("utf-8"))
C = client()
C.initerSocket()
C.requireServer("2")
以下为clientServer1.1.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file clientServer1.1.py
import socket
class clientServer(object):
# 创建 socket 对象
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
host = socket.gethostname()
port = 50022
# 绑定端口号
self.serverSocket.bind((host, port))
# 设置最大连接数,超过后排队
self.serverSocket.listen(10)
def runServer(self):
while True:
# 1,等待客户端的连接
# 建立客户端连接 accept()阻塞式等待连接
clientSocket, addr = self.serverSocket.accept()
print("连接地址: %s" % str(addr))
# 2,接收并处理客户端请求
msg = clientSocket.recv(1024)
# 3,响应资源
r = open("client2/" + msg.decode("utf-8") + ".jpg", 'r')
s = str(r)
r.close()
clientSocket.send(s.encode("utf-8"))
print("已响应")
clientSocket.close()
print("连接关闭")
C = clientServer()
C.initerSocket()
C.runServer()
以下为client1.2.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file client1.1.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file client1.0.py
import socket
class client(object):
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
self.host = socket.gethostname()
self.port = 50013
# 绑定端口号
self.s.bind((self.host, self.port))
def requireServer(self,name):
# 1,与Tracker服务器获取连接
self.s.connect((self.host,8808))
print("Tracker服务器连接成功!")
# 2,向Tracker服务器发送请求信息
self.s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 3,接收到来自Tracker的响应 关闭连接
# 接收小于 1024 字节的数据 接受1.jpg
msg = self.s.recv(1024)
print("响应:" + msg.decode('utf-8'))
self.s.close()
print("Tracker服务器连接关闭")
# 4,通过Tracker的响应来请求需要下载的文件
# 4.1,连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
portc = int(msg.decode("utf-8")[17:22])
s.connect((self.host, portc))
print("Client服务器连接成功!")
# 4.2,请求
s.send(name.encode('utf-8'))
print("请求:我要下载" + name + ".jpg")
# 4.3,接收
msg = s.recv(1024)
print("响应:" + msg.decode('utf-8'))
s.close()
print("Client服务器连接关闭")
# 4.4,存储
w = open("client3/" + name + ".jpg", "w")
w.write(msg.decode("utf-8"))
C = client()
C.initerSocket()
C.requireServer("3")
以下为clientServer1.2.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# @author JourWon
# @date 2023/11/24
# @file clientServer1.2.py
import socket
class clientServer(object):
# 创建 socket 对象
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def initerSocket(self):
host = socket.gethostname()
port = 50023
# 绑定端口号
self.serverSocket.bind((host, port))
# 设置最大连接数,超过后排队
self.serverSocket.listen(10)
def runServer(self):
while True:
# 1,等待客户端的连接
# 建立客户端连接 accept()阻塞式等待连接
clientSocket, addr = self.serverSocket.accept()
print("连接地址: %s" % str(addr))
# 2,接收并处理客户端请求
msg = clientSocket.recv(1024)
# 3,响应资源
r = open("client3/" + msg.decode("utf-8") + ".jpg", 'r')
s = str(r)
r.close()
clientSocket.send(s.encode("utf-8"))
print("已响应")
clientSocket.close()
print("连接关闭")
C = clientServer()
C.initerSocket()
C.runServer()