Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Soket Python Saya Tidak Menerima Data Selepas Panggilan `recv()` Pertama Melainkan Saya Mengubah Suai Pelanggan?

Mengapa Soket Python Saya Tidak Menerima Data Selepas Panggilan `recv()` Pertama Melainkan Saya Mengubah Suai Pelanggan?

Susan Sarandon
Lepaskan: 2024-11-28 20:10:16
asal
668 orang telah melayarinya

Why Doesn't My Python Socket Receive Data After the First `recv()` Call Unless I Modify the Client?

Soket Python tidak Menerima Data Tanpa Menghantar

Masalah:

Kaedah python socket.recv() tidak kembali data apabila dipanggil kali kedua selepas mengedit kod pelayan gema untuk mengelak daripada menghantar data kembali ke pelanggan.

Analisis:

Soket TCP beroperasi sebagai aliran data, tidak mempunyai korelasi satu dengan satu antara menghantar dan menerima panggilan. Kod awal mematuhi protokol tertentu di mana pelayan menghantar semula dengan tepat apa yang diterima sehingga klien menutup sambungan.

Pengubahsuaian telah mengubah peraturan, menyebabkan pelayan terus menerima dan membuang data tanpa bertindak balas sehingga klien menutup kesudahan mereka. Pelanggan, menjangkakan maklum balas serta-merta, tergantung selama-lamanya.

Penyelesaian:

Untuk menyelesaikan isu ini, pelanggan mesti melaraskan tingkah lakunya agar sepadan dengan protokol pelayan yang diubah suai.

  • Pelanggan Pengubahsuaian:

    Tutup bahagian keluar soket untuk menandakan selesai, membenarkan pelayan menghantar respons. Laksanakan berbilang operasi recv() untuk mengendalikan kemungkinan pemecahan data.

  • Kod Klien Yang Dikemas Kini:
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
  • Kod Pelayan Kemas Kini:

    Kekalkan yang diubah protokol, menghantar "ok" setelah pelanggan menutup sambungan masuk mereka.

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

Atas ialah kandungan terperinci Mengapa Soket Python Saya Tidak Menerima Data Selepas Panggilan `recv()` Pertama Melainkan Saya Mengubah Suai Pelanggan?. 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