如何在服务器不崩溃的情况下断开客户端与套接字服务器的连接?
How to disconnect client from socket server without server crshing?
我正在使用 Python 3.7 创建服务器。它的objective是多人连接(目前测试一个客户端),来回发送数据。发送的数据是用户在我的游戏中的高分。我希望服务器获取数据,将数据与最高分进行比较,然后将数据发回并让计算机将其保存到文件中。问题是,客户端接收到的文本数据为 0 和 1!当您退出游戏并尝试重新连接服务器时崩溃:
BrokenPipeError: [Errno 32] 管道损坏
这是服务器的代码:
import socket
import sys
import time
servsock = socket.socket()
host = '192.168.158.155'
port = 5555
highest_score = '0'
servsock.bind((host, port))
print('Sucsessful bind')
servsock.listen(1)
conn, addr = servsock.accept()
print(addr, 'Has connected')
receiving = conn.recv(1024)
receiving = receiving.decode()
while True:
if receiving > highest_score:
highest_score = receiving
message = highest_score
message = message.encode()
conn.send(message)
else:
highest_score = highest_score
failed = highest_score
failed = failed.encode()
conn.send(failed)
这是游戏客户端的代码:
# Read high score
with open('high_score/high_score.txt', 'r+') as f:
score_contents = f.read().replace("\n", " ")
f.close()
# Send data to server
lsock = socket.socket()
host = '192.168.158.155'
port = 5555
lsock.connect((host, port))
print('Connected')
ready_message = score_contents
ready_message = ready_message.encode()
lsock.send(ready_message)
print('sent')
new_high_score = lsock.recv(1024)
new_high_score = new_high_score.decode()
print(str(new_high_score))
with open('high_score/GLOBALhigh_score.txt', 'r+') as GLOBALf:
GLOBALf.truncate()
GLOBALscore_contents = GLOBALf.write(f'Highest Score:,{new_high_score}')
GLOBALf.close()
非常感谢任何帮助!
问题的真正根源是 accept
不在循环中,但这里是使用整数而不是字符串的方法。请注意,您的 if
语句始终发送实际的高分,因此无需复制该代码>
import socket
import sys
import time
servsock = socket.socket()
host = 'localhost'
port = 5555
highest_score = 0
servsock.bind((host, port))
print('Sucsessful bind')
servsock.listen(1)
while True:
conn, addr = servsock.accept()
print(addr, 'Has connected')
receiving = int(conn.recv(1024))
if receiving > highest_score:
highest_score = receiving
message = str(highest_score).encode()
conn.send(message)
另一件事,当您从客户端发送分数时,您将换行符转换为 space。不要那样做;只是发送数字。如果您只是阅读,则不需要“r+”权限,如果您只是要编写,则不需要“r+”权限。为此使用“w”并跳过 truncate
调用。
# Read high score
with open('high_score/high_score.txt', 'r') as f:
score_contents = f.read().strip()
f.close()
我正在使用 Python 3.7 创建服务器。它的objective是多人连接(目前测试一个客户端),来回发送数据。发送的数据是用户在我的游戏中的高分。我希望服务器获取数据,将数据与最高分进行比较,然后将数据发回并让计算机将其保存到文件中。问题是,客户端接收到的文本数据为 0 和 1!当您退出游戏并尝试重新连接服务器时崩溃:
BrokenPipeError: [Errno 32] 管道损坏
这是服务器的代码:
import socket
import sys
import time
servsock = socket.socket()
host = '192.168.158.155'
port = 5555
highest_score = '0'
servsock.bind((host, port))
print('Sucsessful bind')
servsock.listen(1)
conn, addr = servsock.accept()
print(addr, 'Has connected')
receiving = conn.recv(1024)
receiving = receiving.decode()
while True:
if receiving > highest_score:
highest_score = receiving
message = highest_score
message = message.encode()
conn.send(message)
else:
highest_score = highest_score
failed = highest_score
failed = failed.encode()
conn.send(failed)
这是游戏客户端的代码:
# Read high score
with open('high_score/high_score.txt', 'r+') as f:
score_contents = f.read().replace("\n", " ")
f.close()
# Send data to server
lsock = socket.socket()
host = '192.168.158.155'
port = 5555
lsock.connect((host, port))
print('Connected')
ready_message = score_contents
ready_message = ready_message.encode()
lsock.send(ready_message)
print('sent')
new_high_score = lsock.recv(1024)
new_high_score = new_high_score.decode()
print(str(new_high_score))
with open('high_score/GLOBALhigh_score.txt', 'r+') as GLOBALf:
GLOBALf.truncate()
GLOBALscore_contents = GLOBALf.write(f'Highest Score:,{new_high_score}')
GLOBALf.close()
非常感谢任何帮助!
问题的真正根源是 accept
不在循环中,但这里是使用整数而不是字符串的方法。请注意,您的 if
语句始终发送实际的高分,因此无需复制该代码>
import socket
import sys
import time
servsock = socket.socket()
host = 'localhost'
port = 5555
highest_score = 0
servsock.bind((host, port))
print('Sucsessful bind')
servsock.listen(1)
while True:
conn, addr = servsock.accept()
print(addr, 'Has connected')
receiving = int(conn.recv(1024))
if receiving > highest_score:
highest_score = receiving
message = str(highest_score).encode()
conn.send(message)
另一件事,当您从客户端发送分数时,您将换行符转换为 space。不要那样做;只是发送数字。如果您只是阅读,则不需要“r+”权限,如果您只是要编写,则不需要“r+”权限。为此使用“w”并跳过 truncate
调用。
# Read high score
with open('high_score/high_score.txt', 'r') as f:
score_contents = f.read().strip()
f.close()