Soket Python: Memahami Kesan Kelakuan Pemulangan Data
Pada mulanya, contoh pelayan gema Python daripada dokumentasi rasmi berfungsi dengan sempurna. Walau bagaimanapun, selepas mengubah suai kod untuk menghapuskan penghantaran data kembali kepada pelanggan, isu timbul. Seruan kedua kaedah socket.recv() tidak menghasilkan pulangan.
Pelaksanaan Berbeza, Hasil Berbeza
Kod asal daripada dokumentasi menggunakan gelung sementara bahawa:
conn.sendall(data)
Dalam kod yang diubah suai, tingkah laku berubah sebagai berikut:
break
Sifat Strim TCP
Untuk memahami tingkah laku ini, adalah penting untuk memahami sifat aliran TCP. Mereka menghantar data dalam aliran berterusan, tanpa korelasi langsung antara operasi klien dan pelayan. Selain itu, protokol menentukan peraturan komunikasi asas.
Dalam kod asal, protokol menetapkan bahawa pelayan akan menggemakan setiap paket data yang diterima sehingga klien menutup sambungan keluarnya. Selepas penutupan, pelayan akan menutup soketnya.
Protokol Terubah Suai dan Pelarasan Pelanggan
Kod yang diubah suai memperkenalkan protokol baharu di mana pelayan akan membuang data masuk sehingga pelanggan menutup sambungan keluarnya. Selepas itu, pelayan akan menghantar "ok" dan menutup soketnya.
Untuk membuat pelanggan berfungsi dengan protokol baharu ini, adalah perlu untuk:
Pelayan dan Pelanggan yang dikemas kini
Sampel kod yang dikemas kini berikut menunjukkan pelaksanaan protokol yang disemak semula:
Pelayan:
HOST = ''
PORT = 50007
s = soket.soket(soket.AF_INET, soket.SOCK_STREAM)
s.setsockopt(soket.SOL_SOCKET, soket.SO_REUSEADDR, 1)
s.bind(((> HOS, PORT))
s.listen(1)
conn, addr = s.accept()
print('Disambungkan oleh', addr)
sambil Benar:
data = conn.recv(1024) if not data: break
conn.sendall(b'ok')
conn.shutdown(soket.SHUT_WR)
conn.close()
Pelanggan:
HOST = 'localhost'
PORT = 50007
s = soket.soket(soket.AF_INET, soket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall (b'Hello, world')
s.shutdown(soket.SHUT_WR)
data = b''
while True:
data = conn.recv(1024) if not data: break
s.close()
print('Received' , repr(data))
Dengan ini pelaksanaan yang disemak semula, pelayan membuang data masuk dengan cekap, membolehkan pelanggan menerima responsnya selepas ditutup.
Atas ialah kandungan terperinci Mengapa Mengalih Keluar Data Bergema daripada Pelayan Soket Python Menyebabkan `socket.recv()` Tidak Mengembalikan Apa-apa pada Panggilan Seterusnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!