如何在服务器不崩溃的情况下断开客户端与套接字服务器的连接?

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()