计算机网络——模拟BitTorrent

一,语言

        使用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()

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值