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)
因此,我创建了客户端和服务器 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)