一个小的客户端和服务器端的交互,运用TCP技术,python

本文介绍了一个自制的FTP服务器的实现过程,包括服务器端和客户端的代码。服务器端使用Python的socket和threading模块,实现了文件的上传、下载和列表显示功能。客户端同样使用Python编写,可以向服务器发送请求并接收响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器端是类似于百度云的东西,他上边会有文件,客户端连接服务器端后,可以选择在里面下载,或是上传文件。

服务器端:

from socket import *
from threading import Thread
import time
import os
HOST = "192.168.1.201"
PORT = 8888
ADDR = (HOST,PORT)
FTP = "/root/FTP/"
fileaddr = None

class FtpServer:
    def __init__(self,connfd,fileaddr):
        self.connfd = connfd
        self.fileaddr = fileaddr
    def do_list(self):
        file_list = os.listdir(self.fileaddr)
        if not file_list:
            self.connfd.send("该文件夹没东西".encode())
            return
        else:
            self.connfd.send(b"OK")
            time.sleep(0.1)
            fs = ''
        for file in file_list:
            if file[0] != "." and os.path.isfile(self.fileaddr+file):
                fs += file + '\n'
        print(fs)
        self.connfd.send(fs.encode())

    def do_get(self,filename):
        if not os.path.exists(self.fileaddr+filename):
            self.connfd.send("欧,亲爱的,没有这个软件呢".encode())
            return
        else:
            self.connfd.send("OK".encode())
            time.sleep(0.1)
            file = open(self.fileaddr+filename,"rb")
            while True:
                data = file.read(1024)
                if not data:
                    break
                self.connfd.send(data)
            file.close()
            time.sleep(0.1)
            self.connfd.send(b"##")


    def do_put(self, filename):
        file = open(self.fileaddr+filename,"wb")
        while True:
            data = self.connfd.recv(1024)
            if data == b"##":
                break
            file.write(data)
        file.close()
        print("----")



def handle(c):
    cls = c.recv(1024)
    fileaddr = FTP + cls.decode()+"/"
    ftp = FtpServer(c,fileaddr)
    while True:
        data = c.recv(1024).decode()
        if data[0] == "Q" or not data:
            return
        elif data[0] == "L":
            ftp.do_list()
        elif data[0] == "G":
            filename = data.strip().split(" ")[-1]
            ftp.do_get(filename)
        elif data[0] =="P":
            filename = data.strip().split(" ")[-1]
            ftp.do_put(filename)

# da jian wang luo ping tai
def main():
    socked = socket()
    socked.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    socked.bind(ADDR)
    socked.listen(10)
    while True:
        try:
            c,addr = socked.accept()
        except KeyboardInterrupt:
            print("error")
            return
        except Exception as result:
            print(result)
            continue
        print("who is connect:",addr)
        p = Thread(target=handle,args=(c,))
        p.setDaemon(True)
        p.start()

if __name__ == '__main__':
    main()

```python

服务器端:

from socket import *
import os
import time
import sys
HOST = "192.168.1.201"
PORT = 8888
ADDR = (HOST,PORT)
socked = socket()


class FtpClient:
    def __init__(self,socked):
        self.socked = socked
    def do_list(self):
        self.socked.send(b'L')
        data = self.socked.recv(128).decode()
        if data == "OK":
            conntent = self.socked.recv(1024).decode()
            print(conntent)
        else:
            print(data)
    def do_quit(self):
        self.socked.send(b'Q')
        socked.close()
        sys.exit("退出程序")

    def do_get(self,filename):
        self.socked.send(('G '+filename).encode())
        data = self.socked.recv(1024).decode()
        if data =='OK':
            file = open(filename,"wb")
            print("ok")
            while True:
                data = self.socked.recv(1024)
                if data == b"##":
                    break
                file.write(data)
            file.close()
            print("----")
        else:
            print(data)
    def do_put(self,filename):
        if not os.path.exists(filename):
            print("欧,亲爱的,没有这个文件呢")
            return
        else:
            self.socked.send(('P ' + filename).encode())
            time.sleep(0.1)
            file = open(filename,"rb")
            while True:
                data = file.read(1024)
                if not data:
                    break
                self.socked.send(data)
            file.close()
            time.sleep(0.1)
            self.socked.send(b"##")
def request(socked):
    ftp = FtpClient(socked)
    while True:
        print("========\n"
              "list\n"
              "get File\n"
              "put File\n"
              "quit")
        cmd= input("请输入你想进行的模式")
        if cmd == "list":
            ftp.do_list()
        elif cmd =="quit":
            ftp.do_quit()
        elif cmd.strip()[:3] =="get":
            print("进入do_get")
            filename = cmd.strip().split(" ")[-1]
            ftp.do_get(filename)
        elif cmd.strip()[:3] == "put":
            print("进入do_put")
            filename = cmd.strip().split(" ")[-1]
            ftp.do_put(filename)
def main():
    try:
        socked.connect(ADDR)
    except Exception as result:
        print(result)
        print("连接失败")
        return
    else:
        print("==========\n"
              "Data\n"
              "File\n"
              "Image")
        cls = input("请输入你想去的文件夹:")
        if cls not in ["Data","File","Image"]:
            print("你输入错误")
            return
        else:
            socked.send(cls.encode())
            request(socked)

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值