debugging 套接字编程Python服务器端在收到来自客户端的消息时卡住

8ehkhllq  于 2022-12-13  发布在  Python
关注(0)|答案(1)|浏览(123)

I wanted to create a software that can send video through socket programming. I can send 1 video at a time but when I want to send more than 2, it is stuck.
Below is the server code:

import socket
import os

IP = "127.0.0.1"
PORT = 4456
SIZE = 1024
FORMAT = "utf"
SERVER_FOLDER = "video_folder"

def main():
    print("[STARTING] Server is starting.\n")
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP, PORT))
    server.listen()
    print("[LISTENING] Server is waiting for clients.")

    conn, addr = server.accept()
    print(f"[NEW CONNECTION] {addr} connected.\n")

    """ Receiving the folder_name """
    folder_name = conn.recv(SIZE).decode(FORMAT)

    """ Creating the folder """
    folder_path = os.path.join(SERVER_FOLDER, folder_name)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
        conn.send(f"Folder ({folder_name}) created.".encode(FORMAT))
    else:
        conn.send(f"Folder ({folder_name}) already exists.".encode(FORMAT))

    """ Receiving files """
    while True:
        msg = conn.recv(SIZE).decode(FORMAT)

        """ Recv the file name """
        print(f"[CLIENT] Received the filename: {msg}.")
        file_path = os.path.join(folder_path, msg)
        file = open(file_path, "wb")
        conn.send(f"{file_path} filename received.".encode(FORMAT))

        while True:
            msg = conn.recv(SIZE)  # it stuck here once the msg become nothing need help
            if not msg:
                conn.send("The data is saved.".encode(FORMAT))
                break

            file.write(msg)
            print('.', end='', flush=True)

        if not msg: break

    file.close()
    print("\ndone.")

def test():
    while True:
        x = "World"
        print("morning")
        while True:
            print("Hello" + x)
            break

if __name__ == "__main__":
    main()

Below is the client code:

import socket
import os

IP = "127.0.0.1"
PORT = 4456
SIZE = 1024
FORMAT = "utf"
CLIENT_FOLDER = "C:/Users/wende/OneDrive/Desktop/client_folder"

def main():
    """ Staring a TCP socket. """
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((IP, PORT))

    """ Folder path """
    path = os.path.join(CLIENT_FOLDER, "files")
    folder_name = path.split("/")[-1]

    """ Sending the folder name """
    msg = f"{folder_name}"
    print(f"[CLIENT] Sending folder name: {folder_name}")
    client.send(msg.encode(FORMAT))

    """ Receiving the reply from the server """
    msg = client.recv(SIZE).decode(FORMAT)
    print(f"[SERVER] {msg}\n")

    """ Sending files """
    files = sorted(os.listdir(path))

    for file_name in files:
        """ Send the file name """
        print(f"[CLIENT] Sending file name: {file_name}")
        client.send(file_name.encode(FORMAT))

        """ Recv the reply from the server """
        msg = client.recv(SIZE).decode(FORMAT)
        print(f"[SERVER] {msg}")

        """ Send the data """
        file = open(os.path.join(path, file_name), "rb")
        file_data = file.read()
        client.send(file_data)
        print("Sending File...")
        msg = client.recv(SIZE).decode(FORMAT)
        print(f"[SERVER] {msg}")

if __name__ == "__main__":
    main()

I have found out where the code is stuck, but I have no idea why it pauses there for no reason.
The problem I found is I keep loop the received at the server and once the received part is NULL then the loop will stop, but the problem I faced is once the received part is NULL, it cannot jump to the next if statement to check. I try transfer 1 video is no problem at all.
How can I solve this?

j5fpnvbx

j5fpnvbx1#

The solution is here: Sending a file over TCP sockets in Python You need to put this line in the client code

client.shutdown(socket.SHUT_WR)

after

client.send(file_data)

IMO: Better to use async / await words to do your chat asynchronously. In current realization when you receive one message from a first client the second going to wait until the first will finish. I think it will help you Simplest async/await example possible in Python

相关问题