我正在用python做一个本地主机套接字项目,我目前只有线程实现,因此多个客户端可以连接到同一服务器。我从客户端收到一条特定消息,要求断开与服务器的连接,即DISSCONECT_MESSAGE = b'0'
当服务器识别出字节零时,它应关闭服务器与发送该字节的客户端之间的连接。我通过使用if语句捕获零字节来处理此问题。
客户端的send函数总是对消息进行编码,以将其发送到服务器,因此,如果用户输入是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
。无法保证所有字节均已发送(try 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
)指示关闭的连接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句