作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做一个简单的文件传输程序,将文件从客户端传输到服务器。服务器将路径发送到客户端,而客户端将文件发送到服务器。但是我不知道如何在服务器部分中创建文件。实际上,我以二进制模式发送所有文件,但是在服务器模式下接收到每个字节之后,我不知道如何根据接收到的字节来制作文件。
客户部分
sock = 0
path = " "
def open_socket():
global sock
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9000))
def transfer_file(path):
f = open(path, "rb").read()
sock.send(f)
def main():
open_socket()
path = sock.recv(1024)
if __name__ == "__main__":
main()
def open_connection():
global client
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", 9000))
sock.listen(1)
client, address = sock.accept()
def file_transfer():
path = raw_input("Enter path of file: ")
client.send(path)
while True:
file_from_client = client.recv(1024)
def main():
open_connection()
file_transfer()
if __name__ == "__main__":
main()
最佳答案
您需要在套接字上做更多的工作,包括使用sendall
而不是send
(这可能会发送少于完整缓冲区的数据),并为读取方找出一种方法来知道何时完成数据发送。由于您没有让您请求多个文件的消息边界,因此我的示例关闭了套接字,让另一端知道传输已完成。我也摆脱了全局变量。这将传输一个文件:
client.py
import socket
def open_socket():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9000))
return sock
def transfer_file(sock, path):
f = open(path, "rb").read()
sock.sendall(f)
def main():
sock = open_socket()
path = sock.recv(1024)
transfer_file(sock, path)
sock.shutdown(socket.SHUT_RDWR)
sock.close()
if __name__ == "__main__":
main()
import socket
import os
def open_connection():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("0.0.0.0", 9000))
sock.listen(1)
client, address = sock.accept()
sock.close()
return client
def file_transfer(client):
path = raw_input("Enter path of file on client: ")
local_path = os.path.join(os.getcwd(), os.path.basename(path))
print 'will write to local file', local_path
client.send(path)
with open(local_path + '.tmp', 'wb') as outfile:
while True:
block = client.recv(1024)
if not block:
break
outfile.write(block)
os.rename(local_path + '.tmp', local_path)
print 'wrote', os.stat(local_path).st_size, 'bytes'
def main():
client = open_connection()
file_transfer(client)
client.close()
if __name__ == "__main__":
main()
关于python - 从客户端接收字节后制作文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40822492/
我是一名优秀的程序员,十分优秀!