【发布时间】:2018-11-03 23:17:42
【问题描述】:
我目前正在尝试创建一个客户端-服务器应用程序,其中客户端可以使用 TCP 协议将多个文件发送到服务器。服务器最终将创建一个哈希算法并将其发送回客户端,但我遇到了将多个文件从客户端发送到服务器的问题。在当前的形式中,第一个文件正确发送,但之后的文件遇到信息合并在一起的错误。 IE 将文件大小列为第二个文件的名称。我是一个 javascript 花花公子,对 python 非常陌生,因此我将不胜感激如何实现这一点的解释。我相信线程是答案,但由于我对 python 的了解有限,我不知道如何使这项工作。目前我可以一次发送一个文件并且服务器保持打开状态。但是,我想从当前目录中输入几个文件名并对其进行处理。我最终会将整个客户端转换为 C,但我正在努力让服务器在 python 中正常工作。任何建议将不胜感激!
服务器.py
import socket
import hashlib
import threading
import struct
HOST = '127.0.0.1'
PORT = 2345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
print("Waiting for a connection.....")
conn, addr = s.accept()
print("Got a connection from ", addr)
while True:
hash_type = conn.recv(1024)
print('hash type: ', hash_type)
if not hash_type:
break
file_name = conn.recv(1024)
print('file name: ', file_name)
file_size = conn.recv(1024)
file_size = int(file_size, 2)
print('file size: ', file_size )
f = open(file_name, 'wb')
chunk_size = 4096
while file_size > 0:
if file_size < chunk_size:
chuk_size = file_size
data = conn.recv(chunk_size)
f.write(data)
file_size -= len(data)
f.close()
print('File received successfully')
s.close()
客户端.py
import socket
import threading
import os
HOST = '127.0.0.1'
PORT = 2345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
hash_type = input('Enter hash type: ')
files = input('Enter file(s) to send: ')
files_to_send = files.split()
for file_name in files_to_send:
s.send(hash_type.encode())
print(file_name)
s.send(file_name.encode())
file_size = os.path.getsize(file_name)
file_size = bin(file_size)
print(file_size)
s.send(file_size.encode())
f = open(file_name, 'rb')
l = f.read()
while(l):
s.send(l)
l = f.read()
f.close()
print('File Sent')
s.close()
【问题讨论】:
-
您错误地使用了套接字。 TCP 是一种流协议。您必须在其之上构建一些协议,才能正确分离文件。将众所周知的协议(如 HTTP、FTP 等)与库一起使用。
-
哦,对不起,这就是扭曲。我只想使用 TCP 协议
-
HTTP 和 FTP 只使用 TCP。它们是用于分离正确发送的项目的协议。你可以自己发明,但何必呢?
-
谢谢!感谢您的建议,使用 FTP 更容易!