python - Python:套接字未读取字节输入

标签 python python-3.x sockets

我正在用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)
谁能告诉我我在做什么错?

最佳答案

首先,检查sendrecv的返回值。不能保证所有字节都已发送(尝试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/

相关文章:

python - 使用 GeoDjango 获取相关位置字段

python 'dict' 对象没有属性 'viewkeys'

python - PyQt5 中的 QTableView clicked.connect() 键盘滚动等效

c++ - 从 tcp 迁移到 udp 时,‘acceptor’ 不是 ‘boost::asio::ip::udp’ 的成员

c++ - (WINSOCK) C++ 游戏服务器 : Too many TCP connections at once on TCPAccept

python - 调整 Scikit-Learn 分类器的 HOG 特征

python - 如何离线使用 python 中的 Dashboard API?

python - 以没有毫秒的 ISO 格式打印日期时间

Python:名称未定义错误,即使函数在调用前已明确定义

sockets - 监听器套接字上的epoll_wait()和伪造的故障