Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 3.x 套接字在接收时卡住(python)_Python 3.x - Fatal编程技术网

Python 3.x 套接字在接收时卡住(python)

Python 3.x 套接字在接收时卡住(python),python-3.x,Python 3.x,因此,我必须在python上编写用于发送文件的脚本,并且在发送所述文件后,服务器必须告诉客户端它工作正常。但是,当客户机等待接收最后一条消息时,它会被卡住(该消息永远不会被发送,尽管它不在while循环中) 服务器 import socket HOST = 'localhost' PORT = 1024 socketServidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socketServidor.bind((HOST, POR

因此,我必须在python上编写用于发送文件的脚本,并且在发送所述文件后,服务器必须告诉客户端它工作正常。但是,当客户机等待接收最后一条消息时,它会被卡住(该消息永远不会被发送,尽管它不在while循环中)

服务器

import socket
HOST = 'localhost'
PORT = 1024
socketServidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketServidor.bind((HOST, PORT))

socketServidor.listen(1)
print("esperando...")
s_cliente, addr = socketServidor.accept()

mensaje=s_cliente.recv(1024)
print(mensaje.decode("utf-8"))
respuesta=input()
s_cliente.send(respuesta.encode("utf-8"))

if respuesta=="s":
    f = open("hola2.pdf", "wb")

    while True:
        bytes_read = s_cliente.recv(1024)
        if not bytes_read:
            break
        f.write(bytes_read)
    #print("hola")
    s_cliente.send("El archivo ha sido recibido correctamente".encode("utf-8"))
    #print("adios")
    print("El archivo se ha recibido correctamente.")
    s_cliente.close()
    socketServidor.close()
    f.close()

else:
    s_cliente.close()
    socketServidor.close()
客户

import socket
HOST = 'localhost'
PORT = 1024
s_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_tcp.connect((HOST, PORT))

s_tcp.send("¿Quiere recibir archivo? s/n".encode("utf-8"))
recibido=s_tcp.recv(1024)
respuesta=(recibido.decode("utf-8"))

if respuesta=="s":
    with open("hola.pdf", "rb") as f:
        while True:
            bytes_read = f.read(1024)
            if not bytes_read:
                break
            print("hola")
            s_tcp.send(bytes_read)
            print("adios")
    print ("bien")
    #s_tcp.send(bytes_read)
    recibido = s_tcp.recv(1024)
    #print(recibido.decode("utf-8"))
    # s_tcp.send(bytes(f, "utf-8")
    s_tcp.close()
    f.close()





else:
    s_tcp.close()

如果停止运行客户端服务器,服务器将自动结束接收文件并成功退出。

在发送端关闭套接字之前,接收端永远不会从
.recv()
返回空字符串,在这种情况下,您无法执行此操作,因为您计划发送更多数据。通常的解决方案是在文件数据之前加上一个长度值,以便接收方知道要读取多少。