所以,我創建了客戶端和服務器唱套接字。
一切正常,但我剛剛使用 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 以便它可以讀取下一條訊息的長度,它只會拋出一個錯誤,例如]6str。我完全不知道為什么會這樣。我嘗試使用與資料庫不同的表并更改緩沖區大小,但它仍然在某處吃東西。服務器中有兩個列印件。首先顯示接收時使用的緩沖區。第二個用于顯示它實際收到了多少個符號,并且它始終有效,但不適用于該字串。
If I didn't cover something here or some important info, please write in comment and I will provide it.
uj5u.com熱心網友回復:
您的問題是您的生產字串包含一個非 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/340129.html
上一篇:將bytearray轉換為array.array('B')
下一篇:獲取函式而不是鏈接
