Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Mengalih Keluar Data Bergema daripada Pelayan Soket Python Menyebabkan `socket.recv()` Tidak Mengembalikan Apa-apa pada Panggilan Seterusnya?

Mengapa Mengalih Keluar Data Bergema daripada Pelayan Soket Python Menyebabkan `socket.recv()` Tidak Mengembalikan Apa-apa pada Panggilan Seterusnya?

Mary-Kate Olsen
Lepaskan: 2024-11-27 03:37:22
asal
924 orang telah melayarinya

Why Does Removing Data Echoing from a Python Socket Server Cause `socket.recv()` to Return Nothing on Subsequent Calls?

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)

Barisan ini membayangkan bahawa pelayan akan menggemakan semula data yang diterima kepada klien sehingga klien menutup penghujung sambungannya.

Dalam kod yang diubah suai, tingkah laku berubah sebagai berikut:

break

Apabila kaedah conn.recv(1024) dipanggil buat kali kedua, kaedah itu akan ditamatkan serta-merta, tanpa meninggalkan data tersedia untuk pelanggan.

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:

  1. Menutup sambungan keluar pelanggan ke menunjukkan siap.
  2. Laksanakan berbilang panggilan recv() untuk mengambil kira kemungkinan pemecahan dalam data penghantaran.

Pelayan dan Pelanggan yang dikemas kini

Sampel kod yang dikemas kini berikut menunjukkan pelaksanaan protokol yang disemak semula:

Pelayan:

import soket

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
Salin selepas log masuk
Salin selepas log masuk

conn.sendall(b'ok')
conn.shutdown(soket.SHUT_WR)
conn.close()

Pelanggan:

import soket

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
Salin selepas log masuk
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan