TCP多线程Python

问题描述 投票:0回答:1

我是Python和Thread的新手,我正在尝试用python制造一个TCP服务器。客户端与服务器的连接良好,但是只能输入1条命令,然后它崩溃,这是代码:

serverSocket = socket(AF_INET, SOCK_STREAM)


def Main():
    serverPort = 7722
    print("The server is ready to receive on port", serverPort)
    serverSocket.bind(('', serverPort))
    serverSocket.listen(1)


def start_socket(connectionSocket):
    while True:
        print('Connection requested from', clientAddress)
        client_code_number = connectionSocket.recv(2048)
        server_code_number = client_code_number.decode()
        if (server_code_number == "1"):
            print("Command 1\n\n")
            message = connectionSocket.recv(2048)
            modifiedMessage = message.decode().upper()
            connectionSocket.send(modifiedMessage.encode())
        connectionSocket.close()


if __name__ == '__main__':
    Main()
    while True:
        (connectionSocket, clientAddress) = serverSocket.accept()
        os.system('cls')
        print('connexion from: ' + str(clientAddress))
        _thread.start_new_thread(start_socket, (connectionSocket,))
serverSocket.close()

这里是客户:

def start_socket():
    init_text()
    choice_number = input('Input option: ')
    #GET THE USER NUMBER
    clientSocket.send(choice_number.encode())
    while True:
        if choice_number == "1":
            sentence_caps = input('Input sentence: ')
            clientSocket.send(sentence_caps.encode())
            modifiedMessage = clientSocket.recv(2048)
            print('\nReply from server:', modifiedMessage.decode())
            start_socket()
        else:
            start_socket()

这是我的错误:

File "BasicTCPServer.py", line 33, in start_socket
client_code_number = connectionSocket.recv(2048)
OSError: [Errno 9] Bad file descriptor
python python-3.x multithreading
1个回答
1
投票

根本原因是套接字正在关闭。

def start_socket(connectionSocket):
    while True:
        print('Connection requested from', clientAddress) # <-- where does client address come from
        client_code_number = connectionSocket.recv(2048)  # <-- this works the first time round
        server_code_number = client_code_number.decode()
        if (server_code_number == "1"):
            ...
        connectionSocket.close()  # <-- this closes the socket

您的代码在整个循环中第二次抱怨。 connectionSocket已关闭,因此它是一个错误的文件描述符。

© www.soinside.com 2019 - 2024. All rights reserved.