我正在运行服务器和客户端。客户端请求注册并且必须输入用户名。在此之后,程序会卡在服务器端的
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) 上。
服务器端未实现所有所需操作:
...服务器必须执行序列socket()、bind()、listen()、accept()(可能重复accept()来服务多个客户端),而客户端只需要序列socket() ,连接()。