我是python的新手,正在尝试以下操作,我有两次尝试:Server.py
和Client.py
我想将服务器目录中存在的所有文件发送到客户端的某个目录侧。即
C:\ ServerDir \ file1.txt
C:\ ServerDir \ file2.txt
C:\ ServerDir \ file3.txt ...
将转到:
D:\ ClientDir \ file1.txt
D:\ ClientDir \ file2.txt
D:\ ClientDir \ file3.txt ...
目前,我可以发送单个文件 Server.py :
import socket # Import socket module
port = 60000 # Reserve a port for your service.
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
s.bind((host, port)) # Bind to the port
s.listen(5) # Now wait for client connection.
print ('Server listening....')
while True:
conn, addr = s.accept() # Establish connection with client.
print ('Got connection from', addr)
data = conn.recv(1024)
print('Server received', repr(data))
filename='C:\\Users\\Desktop\\File.txt'
f = open(filename,'rb')
l = f.read(1024)
while (l):
conn.send(l)
print('Sent ',repr(l))
l = f.read(1024)
f.close()
print('Done sending')
conn.send('Thank you for connecting'.encode())
conn.close()
Client.py:
import socket # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 60000 # Reserve a port for your service.
s.connect((host, port))
s.send("Hello server!".encode())
with open('C:\\Users\\Desktop\\Python\\gg.txt', 'wb') as f:
print ('file opened')
while True:
print('receiving data...')
data = s.recv(1024)
print('data=%s', (data))
if not data:
break
# write data to a file
f.write(data)
f.close()
print('Successfully get the file')
s.close()
print('connection closed')
我试图遍历服务器端的所有文件,例如:
for file in os.listdir('C:\\Users\\Desktop\\'):
filename = 'C:\\Users\\Desktop\\'+file
但它仅发送第一个文件。
答案 0 :(得分:0)
关键是-您如何知道文件结束?在当前的实现中,如果连接结束,则文件也将终止(然后您的套接字已关闭,因此没有下一个文件的机会)。
有两种解决方案:
简单:让客户端为每个文件打开一个新连接(即,将内容移入循环);如果您的连接瞬间中断,也许一切就此结束
更好:让服务器先发送文件大小,再发送文件本身。让客户端仅将数据写入文件直到大小正确,然后再开始处理新文件。
当然,您仍然对服务器如何知道要分配传入文件的文件名存在疑问。您可以将它们放到现在可能包含文件名的“标题”中:)
如果您想知道,这正是HTTP的功能(很好,足够接近)。每个文件都有标题,然后是空行,然后是字节流,其长度之前由Content-Length
标题传达。之后,该连接可以重新用于下一个文件。如果Content-Length
丢失,则代理将读取直到连接断开(并且下一个文件将需要建立新连接)。