pickle.loads(clientSocket.recv(4028)) 卡住了

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

我正在运行服务器和客户端。客户端请求注册并且必须输入用户名。在此之后,程序会卡在服务器端的

message = pickle.loads(clientSocket.recv(4028))
行中。

客户

def signUp():
    while True:
        global myAccount
        userName = input("Please enter a user name you like or q to quit\n").strip()
        messageToSend = message.Message(userName) #sent messageToSend.text = usernName
        if userName == "q":
            break
        clientSocket.sendall(pickle.dumps(message.Message("SignUp*******"))) #1st message sent this messge is recieved in the main method on the server (used to identify the request i.e SignUp from SignIn for example)
        clientSocket.sendall(pickle.dumps(messageToSend)) #2nd message sent
        createdAcc = (pickle.loads(clientSocket.recv(4028))).account #3rd message recieved
        if(createdAcc.status == account.Status.OFFLINE):
            print("That username is taken\n")
        else:
            myAccount = createdAcc
            print("Account created your username is:\n"+myAccount.accUsername)
            break

服务器

def signUp(clientSocket):
    username = pickle.loads(clientSocket.recv(4028)).text #2nd Message recieved. This is where it gets stuck. specifically clientSocket.recv(4028) does not end evaluating
    if(not alreadyAUser(username)):
        user = account.Account()
        user.accUsername = username
        user.status = account.Status.ONLINE
        with userBaseLock:
            userBase.append(user)
        messageToSend = message.Message().withAccount(user)
        clientSocket.sendall(pickle.dumps(messageToSend)) #3rd Message sent
    else:
        clientSocket.sendall(pickle.dumps(message.Message().withAccount(account.Account()))) #3rd Message Sent


def clientHandler(clientSocket):
    while True:
        messageSent = pickle.loads(clientSocket.recv(4028)) #1st message recieved
        message = messageSent.text

        # Sign Up
        if (message == requests[0]): #request[0] = "SignUp*******"
            signUp(clientSocket)
        #rest of the code

我尝试用此代码替换有问题的行

data = b""  # Initialize an empty bytes object

while True:
    chunk = socket.recv(4028) # Receive data in chunks
    if not chunk:
        break                 # Break the loop if no more data is received
    data += chunk 
username = pickle.loads(data)

这没有帮助,但我能够看到循环只运行两次,并在第二次执行时卡在 chunk = socket.recv(4028) 上。

python sockets server tcp network-programming
1个回答
0
投票

服务器端未实现所有所需操作

...服务器必须执行序列socket()、bind()、listen()、accept()(可能重复accept()来服务多个客户端),而客户端只需要序列socket() ,连接()。

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