Python 套接字 - 最后一个符号丢失

Python Socket - last symbol is missing

因此,我创建了客户端和服务器 sing 套接字。
一切正常,但我只是用 MySQL 数据库中的字符串中断了。

服务器:

import socket
import threading


PORT = 9696
SERVER = "localhost"
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)


def handle_client(conn):
    while True:
        actual_size = int(conn.recv(30).decode(FORMAT).replace("#", ""))
        size = int(actual_size / 1024)
        rest_msg = actual_size - (size * 1024)
        received_message = ""
        for chunk in range(size):
            received_message += conn.recv(1024).decode(FORMAT)
        received_message += conn.recv(rest_msg).decode(FORMAT)
        print(rest_msg)
        print(len(received_message))


def start():
    server.listen()
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn,))
        thread.start()


start()

客户:

import socket
import time

HEADER = 64
PORT = 9696
FORMAT = 'utf-8'
SERVER = "localhost"
ADDR = (SERVER, PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)


def send(msg):
    client.send(msg.encode("utf-8"))


msg_to_send = "Some random message"

time.sleep(3)
for i in range(1000):
    send(str(len(msg_to_send)) + ("#" * (30 - len(str(len(msg_to_send)))) + msg_to_send))

while True:
    pass

如果我将 msg_to_send 替换为以下文本:

[('index', 'bigint(20)', 'YES', 'MUL', None, ''), ('LP', 'text', 'YES', '', None, ''), (' NR-a', 'text', 'YES', '', None, ''), ('LITERA-a', 'text', 'YES', '', None, ''), ('MUFA-a', 'double', 'YES', '', None, ''), ('UWAGI-a', 'text', 'YES', '', None, ''), ('TUBY-a', 'double', 'YES', '', None, ''), ('DATA1-a', 'text', 'YES', '', None, ''), ('DATA2-a', 'text', 'YES', '', None, ''), ('SPAWY-i', 'text', 'YES', '', None, ''), ('SPAWY_DAC-i', 'text', 'YES', '', None, ''), ('LOG-a', 'text', 'YES', '', None, ''), ('SPLIT1X4-i', 'text', 'YES', '', None, ''), ('SPLIT1X8-i', 'text', 'YES', '', None, ''), ('SPLIT1X16-i', 'text', 'YES', '', None, ''), ('ADAPTERY SIMPLE-i', 'double', 'YES', '', None, ''), ('ADAPTERY DUPLEX-i', 'double', 'YES', '', None, ''), ('PIGTAIL-i', 'double', 'YES', '', None, ''), ('OLT-a', 'double', 'YES', '', None, ''), ('NEXT-a', 'double', 'YES', '', None, ''), ('ODNOGA_1-a', 'double', 'YES', '', None, ''), ('ODNOGA_2-a', 'double', 'YES', '', None, ''), ('ODNOGA_3-a', 'double', 'YES', '', None, ''), ('ODNOGA_4-a', 'double', 'YES', '', None, ''), ('DROP30-i', 'double', 'YES', '', None, ''), ('DROP50-i', 'double', 'YES', '', None, ''), ('DROP70-i', 'double', 'YES', '', None, ''), ('DROP80-i', 'double', 'YES', '', None, ''), ('DROP100-i', 'double', 'YES', '', None, ''), ('DROP120-i', 'double', 'YES', '', None, ''), ('DROP150-i', 'double', 'YES', '', None, ''), ('DROP200-i', 'double', 'YES', '', None, ''), ('MAŁPKI-i', 'double', 'YES', '', None, '')]

它丢失了 ],所以如果下一条消息将被转换为 int 以便它可以读取下一条消息的长度,它只会抛出一个错误,例如 ]6 是海峡 我完全不知道为什么会这样。我已经尝试使用来自数据库的不同 table 并更改缓冲区大小,但它仍然在某个地方吃掉这个和平。 服务器中有两个打印件。首先显示接收时使用的缓冲区。第二个用于显示它实际收到了多少个符号,它始终有效但不适用于该字符串。

如果我在这里没有涵盖某些内容或一些重要信息,请写在评论中,我会提供。

您的问题是您的生产字符串包含一个非 ASCII 字符,并且在您编码为 UTF-8 时会转换为多个字节。在您的长度传输中不考虑这些多个字节。您需要在转换后获取长度。所以,摆脱“发送”功能并做:

msg_to_send = msg_to_send.encode('utf-8')
for i in range(1000):
    print(len(msg_to_send))
    prefix = (str(len(msg_to_send)) + "#"*30)[:30].encode('utf-8')
    client.send(prefix + msg_to_send)

while True:
    time.sleep(5)