Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Soket Python Saya Tidak Menerima Data Tanpa Menghantar?

Mengapa Soket Python Saya Tidak Menerima Data Tanpa Menghantar?

Mary-Kate Olsen
Lepaskan: 2024-11-30 18:59:12
asal
548 orang telah melayarinya

Why Doesn't My Python Socket Receive Data Without Sending?

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

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

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!

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