服务端:
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 生成】
问题已经给出了一段代码,其中包括一个服务端和一个客户端。这段代码的目标是实现客户端向服务端请求文件,并成功将文件传输给客户端。然而,这段代码存在一些问题,需要修改和补充。
# 在客户端中,添加接收文件的函数
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()
问题:服务端在处理完一个客户端请求后没有关闭连接。 解决方案:在代码的最后,添加 conn.close()
来关闭连接。建议将 conn.close()
放在 while True
循环之后,以确保所有文件传输完毕后再关闭连接。
问题:客户端没有处理服务器发送空数据的情况。 解决方案:在客户端的代码中,加入对连接断开的判断,如果接收到的数据为空,则说明服务器断开了连接,此时需要关闭客户端的连接并退出循环。
# 修改客户端的代码,在接收文件的函数中增加连接断开的判断
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('文件传输完毕')
现在,经过以上修改,客户端和服务端应该能够成功进行文件传输了。
【相关推荐】