Masalah:
Kaedah python socket.recv() tidak kembali data apabila dipanggil kali kedua selepas mengedit kod pelayan gema untuk mengelak daripada menghantar data kembali ke pelanggan.
Analisis:
Soket TCP beroperasi sebagai aliran data, tidak mempunyai korelasi satu dengan satu antara menghantar dan menerima panggilan. Kod awal mematuhi protokol tertentu di mana pelayan menghantar semula dengan tepat apa yang diterima sehingga klien menutup sambungan.
Pengubahsuaian telah mengubah peraturan, menyebabkan pelayan terus menerima dan membuang data tanpa bertindak balas sehingga klien menutup kesudahan mereka. Pelanggan, menjangkakan maklum balas serta-merta, tergantung selama-lamanya.
Penyelesaian:
Untuk menyelesaikan isu ini, pelanggan mesti melaraskan tingkah lakunya agar sepadan dengan protokol pelayan yang diubah suai.
Pelanggan Pengubahsuaian:
Tutup bahagian keluar soket untuk menandakan selesai, membenarkan pelayan menghantar respons. Laksanakan berbilang operasi recv() untuk mengendalikan kemungkinan pemecahan data.
import socket HOST = 'localhost' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b'Hello, world') s.shutdown(socket.SHUT_WR) data = b'' while True: buf = s.recv(1024) if not buf: break data += buf s.close() print('Received', repr(data))
Kod Pelayan Kemas Kini:
Kekalkan yang diubah protokol, menghantar "ok" setelah pelanggan menutup sambungan masuk mereka.
import socket HOST = '' PORT = 50007 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() print('Connected by', addr) while True: data = conn.recv(1024) if not data: break conn.sendall(b'ok') conn.shutdown(socket.SHUT_WR) conn.close()
Atas ialah kandungan terperinci Mengapa Soket Python Saya Tidak Menerima Data Selepas Panggilan `recv()` Pertama Melainkan Saya Mengubah Suai Pelanggan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!