Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从客户端接收字节后生成文件_Python_Sockets - Fatal编程技术网

Python 从客户端接收字节后生成文件

Python 从客户端接收字节后生成文件,python,sockets,Python,Sockets,我想做一个简单的文件传输程序,将文件从客户端传输到服务器。服务器向客户端发送路径,客户端向服务器发送文件。但是我不知道如何在服务器部分创建文件。事实上,我以二进制模式发送所有文件,但之后我以服务器模式接收每个字节,我不知道如何根据接收到的字节生成文件 客户部分 sock = 0 path = " " def open_socket(): global sock sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

我想做一个简单的文件传输程序,将文件从客户端传输到服务器。服务器向客户端发送路径,客户端向服务器发送文件。但是我不知道如何在服务器部分创建文件。事实上,我以二进制模式发送所有文件,但之后我以服务器模式接收每个字节,我不知道如何根据接收到的字节生成文件

客户部分

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()
server.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()

是否有任何理由不使用http或sftp或任何其他现有协议将文件发送到服务器?这里有一个