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
Mary-Kate Olsenasal
2024-11-30 18:59:12496semak imbas

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()

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!

Kenyataan:
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