مثال حلشده
پیشرفته اکوی طولاول
صورت مسئله
چرا فرستادنِ خام کافی نیست و ۴ بایت طول اولِ پیام چه مشکلی را حل میکند؟
راهحل گامبهگام
۴ گام باقی مانده
import socket, struct
def send_message(sock, text):
data = text.encode("utf-8")
sock.sendall(struct.pack(">I", len(data)) + data)
def recv_exact(sock, n):
buf = b""
while len(buf) < n:
chunk = sock.recv(n - len(buf))
if not chunk:
raise ConnectionError("اتصال وسط پیام قطع شد.")
buf += chunk
return buf
def recv_message(sock):
(length,) = struct.unpack(">I", recv_exact(sock, 4))
return recv_exact(sock, length).decode("utf-8")
# سرور (در یک ترمینال)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(("127.0.0.1", 65432))
s.listen(1)
conn, addr = s.accept()
with conn:
msg = recv_message(conn)
send_message(conn, "echo:" + msg)
# کلاینت (در ترمینال دیگر)
with socket.create_connection(("127.0.0.1", 65432), timeout=5) as s:
send_message(s, "سلام سرور")
print(recv_message(s)) # echo:سلام سرور