Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Soket Python Saya Tidak Menerima Data Tanpa Menghantar?
Soket Python Tidak Menerima Tanpa Menghantar
Soalan ini membincangkan isu di mana contoh soket diubah suai daripada dokumentasi Python gagal menerima data selepas penghantaran awal telah dilumpuhkan. Masalah timbul disebabkan sifat semula jadi soket TCP, yang menganggap data sebagai aliran berterusan.
Dalam contoh asal, gelung while memastikan pelayan menggemakan semula setiap mesej yang diterima. Ini mewujudkan protokol mudah di mana penghantaran mencetuskan respons.
Walau bagaimanapun, dalam versi yang diubah suai, mengalih keluar fungsi gema mengganggu protokol. Pelayan menjadi pengguna data yang tidak terhingga, menunggu pelanggan untuk menutup sambungan. Memandangkan penghantaran dilumpuhkan, data pelanggan tidak diakui atau bergema kembali, menyebabkan ia tergantung sementara menunggu respons.
Penyelesaian terletak pada menyesuaikan tingkah laku pelanggan kepada protokol baharu. Daripada mengharapkan respons segera, pelanggan harus menutup penghujung sambungannya dengan anggun. Ini memberi isyarat kepada pelayan bahawa ia telah selesai menghantar data, menggesa pelayan menghantar mesej "ok" yang dijangkakan.
Untuk meningkatkan kebolehpercayaan, pelanggan boleh menggunakan berbilang panggilan recv untuk mengendalikan kemungkinan pemecahan data. Pengubahsuaian ini memastikan mesej yang tersegmentasi sama rata berjaya diterima.
Kod Contoh Yang Dikemas Kini:
Pelayan
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()
Pelanggan
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))
Dengan mengikuti pengubahsuaian ini, contoh memastikan bahawa pelanggan melakukannya tidak hang, dan pelayan mengendalikan pertukaran data dengan anggun, walaupun tanpa respons segera daripada pelayan.
Atas ialah kandungan terperinci Mengapa Soket Python Saya Tidak Menerima Data Tanpa Menghantar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!