我正在用python做一个小的localhost套接字项目,我目前只有线程实现,因此多个客户端可以连接到同一服务器。当服务器识别出字节零时,我有一条来自客户端的特定消息要断开与服务器的连接,即DISSCONECT_MESSAGE = b'0'
,它应关闭服务器与发送该消息的客户端之间的连接。我通过使用if语句捕获零字节来处理此问题。
客户端发送函数始终对消息进行编码,以将其发送到服务器,因此,如果用户输入的是0
,则它通过编码传递,现在我有了b'0'
,当服务器接收到此消息时,它又将其解码,所以我又有了0
,这就是为什么在这个if语句,我再次对其进行编码,以了解消息是否为0
:
if msg.encode() == DISSCONECT_MESSAGE:
connected = False
我通过在handle_client
函数之前添加打印来测试conn.close ()
,但是它从不显示该打印,因此它永远不会退出while循环,因此也不会关闭与客户端的连接。这是我的代码:
server.py
import socket
import threading
HEADER = 64
PORT = 65500
SERVER = ''
ADDRESS = (SERVER,PORT)
FORMAT = 'utf-8'
DISSCONECT_MESSAGE = b'0'
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDRESS)
def handle_client(conn, addr):
print(f"[NEW CONNECTION] {addr} connected")
connected = True
while connected:
msg_length = conn.recv(HEADER).decode(FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(FORMAT)
if msg.encode() == DISSCONECT_MESSAGE:
connected = False
if msg[:2] == "10":
conn.send("[CODE 10] Log in request".encode(FORMAT))
print(f"[{addr}] {msg}")
conn.send("Message recived".encode(FORMAT))
print(f"[{addr}] DISSCONNECTED")
conn.close()
def start():
server.listen()
print(f"[LISTENING] Server is listening on {SERVER}")
while True:
conn, addr = server.accept() # Wait to a new connection
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount()-1}")
print("[STARTING] Server is starting...")
start()
client.py import socket
HEADER = 64
PORT = 65500
FORMAT = 'utf-8'
DISSCONECT_MESSAGE = b'0'
SERVER = 'localhost'
ADDRESS = (SERVER,PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 65500))
def send(msg):
message = msg.encode(FORMAT)
msg_length = len(message)
send_length = str(msg_length).encode(FORMAT)
send_length += b' ' * (HEADER - len(send_length))
client.send(send_length)
client.send(message)
print(client.recv(1024).decode(FORMAT))
while True:
msg = input()
if msg.encode() == DISSCONECT_MESSAGE:
print("[DISSCONECTED FROM SERVER]")
client.send(DISSCONECT_MESSAGE)
else:
send(msg)
谁能告诉我我在做什么错?
最佳答案
首先,检查send
和recv
的返回值。不能保证所有字节都已发送(尝试sendall
),并且recv
返回0(套接字关闭)或请求的1长度字节,不一定是请求的总数。
就您的主要错误而言,您已将字符零('0')发送给服务器,并且服务器收到的字符长度为:
msg_length = conn.recv(HEADER).decode(FORMAT)
结果的长度为0。msg
然后成为一个空字符串,其中:msg = conn.recv(msg_length).decode(FORMAT)
msg.encode() == b''
(空字符串)而不是b'0'
长度为1的字符串,包含零字符。取而代之的是,您可以在长度为0时放弃。或者断开连接的正常方法是关闭连接。然后,服务器接收到
b''
(长度为零recv
),该信息指示已关闭的连接。
关于python - Python:套接字未读取字节输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65820009/