客户端与服务端文件传输

服务端:



import socket
import json
import os

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)
print('建立连接')

while True:
    conn, addr = server.accept()
    print('以接收客户端>>>')
    while True:
        try:
            content = conn.recv(1024)
        except:
            break
        if content == 'get':
            print('开始传输文件>>>')
            data_size = os.path.getsize('服务端文件.txt')
            path_name = '服务端文件.txt'
            header = {
                'file_name': path_name,
                'file_size': data_size,
            }
            header_json = json.dumps(header)
            header_bytes = header_json.encode('utf-8')
            header_h = bytes(str(len(header_bytes)), 'utf-8').zfill(4)
            conn.send(header_h)
            conn.send(header_bytes)
            print('头文件传输完毕>>>')
            with open('服务端01.py', mode='rb') as f:
                for line in f:
                    conn.send(line)
                print('已将所有文件传输完毕>>>')

    # conn.close()

客户端:



import socket
import json

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    res = input('请输入文件命令>>>').strip()
    if not res:
        continue
    client.send(res.encode('utf-8'))
    # 先拿到头部长度
    header_size = int(client.recv(4).decode('utf-8'))
    header_json = client.recv(header_size).decode('utf-8')
    header = json.loads(header_json)
    print(header)
    data_size = header['file_size']
    recv_size = 0
    data = b''
    while recv_size < data_size:
        res = client.recv(1024)
        recv_size += len(res)
        data += res
    with open('客户端文件.txt', mode='wb') as f:
        f.write(data)

为啥文件传输不到客户端也没有报错

【以下回答由 GPT 生成】

问题已经给出了一段代码,其中包括一个服务端和一个客户端。这段代码的目标是实现客户端向服务端请求文件,并成功将文件传输给客户端。然而,这段代码存在一些问题,需要修改和补充。

  1. 问题:客户端和服务端没有定义传输文件的具体操作。 解决方案:在代码的注释中已经说明,客户端需要先拿到头部长度,然后再接收文件内容。服务端需要根据客户端发送的请求判断是否传输文件。为了避免代码重复,可以将文件传输的部分封装成一个函数,分别在客户端和服务端调用。
# 在客户端中,添加接收文件的函数
def receive_file(sock):
    header_size = int(sock.recv(4).decode('utf-8'))
    header_json = sock.recv(header_size).decode('utf-8')
    header = json.loads(header_json)
    file_name = header['file_name']
    file_size = header['file_size']

    with open(file_name, 'wb') as f:
        received_size = 0
        while received_size < file_size:
            data = sock.recv(1024)
            f.write(data)
            received_size += len(data)
        print('文件传输完毕')

# 在服务端中,添加发送文件的函数
def send_file(sock):
    data_size = os.path.getsize('服务端文件.txt')
    path_name = '服务端文件.txt'
    header = {
        'file_name': path_name,
        'file_size': data_size,
    }
    header_json = json.dumps(header)
    header_bytes = header_json.encode('utf-8')
    header_h = bytes(str(len(header_bytes)), 'utf-8').zfill(4)
    sock.send(header_h)
    sock.send(header_bytes)
    print('头文件传输完毕')

    with open('服务端文件.txt', mode='rb') as f:
        for line in f:
            sock.send(line)
        print('已将所有文件传输完毕')

# 修改客户端的代码
import socket
import json

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
    res = input('请输入文件命令>>>').strip()
    if not res:
        continue
    client.send(res.encode('utf-8'))
    if res == 'get':
        receive_file(client)

# 修改服务端的代码
import socket
import json
import os

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)
print('建立连接')

while True:
    conn, addr = server.accept()
    print('已接收客户端>>>')
    while True:
        try:
            content = conn.recv(1024)
        except:
            break
        if content.decode('utf-8') == 'get':
            print('开始传输文件>>>')
            send_file(conn)

# conn.close()
  1. 问题:服务端在处理完一个客户端请求后没有关闭连接。 解决方案:在代码的最后,添加 conn.close() 来关闭连接。建议将 conn.close() 放在 while True 循环之后,以确保所有文件传输完毕后再关闭连接。

  2. 问题:客户端没有处理服务器发送空数据的情况。 解决方案:在客户端的代码中,加入对连接断开的判断,如果接收到的数据为空,则说明服务器断开了连接,此时需要关闭客户端的连接并退出循环。

# 修改客户端的代码,在接收文件的函数中增加连接断开的判断
def receive_file(sock):
    header_size = int(sock.recv(4).decode('utf-8'))
    if not header_size:  # 处理连接断开的情况
        print('连接已断开')
        sock.close()
        return

    header_json = sock.recv(header_size).decode('utf-8')
    header = json.loads(header_json)
    file_name = header['file_name']
    file_size = header['file_size']

    with open(file_name, 'wb') as f:
        received_size = 0
        while received_size < file_size:
            data = sock.recv(1024)
            if not data:  # 处理连接断开的情况
                print('连接已断开')
                sock.close()
                return
            f.write(data)
            received_size += len(data)
        print('文件传输完毕')

现在,经过以上修改,客户端和服务端应该能够成功进行文件传输了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^