Python Socket -缺少最后一个符号



因此,我创建了客户机和服务器的套接字。
一切都工作得很好,但我只是打破了然后使用字符串从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是str。我完全不知道为什么会这样。我已经尝试了不同的表从数据库和改变缓冲区大小,但它仍然吃这一个和平的地方。服务器上有两个指纹。首先显示接收时使用的缓冲区。第二个用来显示它实际接收了多少个符号它总是工作的,但不是那个字符串。

如果我在这里没有提到的东西或一些重要的信息,请写在评论中,我会提供给你。

您的问题是您的生产字符串包含一个非ascii字符,并且在编码为UTF-8时将其转换为多个字节。这些多个字节不会在长度传输中被考虑在内。你需要抓住转换后的长度。因此,去掉send"功能和用途:

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)

最新更新