php - Socket menerima permintaan http Di manakah kita boleh menentukan penghujung permintaan dengan membaca?
三叔
三叔 2017-07-03 11:40:16
0
1
1053

Saya ingin membuat alat proksi http menggunakan go:

   func main() {
        listener, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Panic(err)
        }
        for {
            client, err := listener.Accept()
            if err != nil {
                log.Panic(err)
            }
            go handleClientRequest(client)
        }
    }
    
    func handleClientRequest(client net.Conn) {
        if client == nil {
            return
        }
        defer client.Close()
    
        var buf [1024]byte
        n, err := client.Read(buf[:])
        if err != nil {
            log.Println(err)
            return
        }
        fmt.Println("recv msg:", string(buf[0:n]))
    }

1024 bait mungkin tak cukup, mesti ada tanda tamat kan?

三叔
三叔

membalas semua(1)
三叔

Protokol Http adalah berdasarkan protokol TCP Apabila penyemak imbas perlu mendapatkan data halaman web daripada pelayan, ia akan mengeluarkan permintaan Http. Http akan mewujudkan saluran sambungan ke pelayan melalui TCP Apabila data yang diperlukan untuk permintaan ini selesai, Http akan segera memutuskan sambungan TCP

.

Protokol TCP melepaskan sambungan dengan menghantar paket FIN, jadi paket FIN ialah tanda akhir, yang bermaksud ia diterima sehingga sambungan terputus.

Tetapi

Semakin masa berlalu, halaman HTML menjadi lebih kompleks, dan mungkin terdapat banyak gambar yang tertanam di dalamnya, pada masa ini, adalah tidak cekap untuk mewujudkan sambungan TCP setiap kali untuk mengakses gambar. Oleh itu Keep-Alive dicadangkan untuk menyelesaikan masalah kecekapan rendah. Bermula dari HTTP/1.1, Keep-Alive didayakan secara lalai untuk mengekalkan ciri sambungan Ringkasnya, apabila halaman web dibuka, sambungan TCP yang digunakan untuk menghantar data HTTP antara klien dan pelayan tidak akan ditutup klien Apabila anda melawat halaman web pada pelayan ini sekali lagi, anda akan terus menggunakan sambungan yang telah ditetapkan ini, Keep-Alive tidak mengekalkan sambungan secara kekal Ia mempunyai masa pengekalan, yang boleh ditetapkan dalam perisian pelayan yang berbeza (seperti Apache). Walaupun sambungan TCP dikekalkan untuk tempoh masa di sini, masa ini terhad dan masih akan ditutup pada titik masa, jadi kami juga menganggapnya sebagai penutupan selepas setiap sambungan selesai.

Jadi bagaimana untuk menilai kesudahannya selepas menghidupkan Keep-Alive?
Malah, pengepala HTTP mempunyai panjang kandungan, iaitu panjang badan paket HTTP

Sudah tentu, terdapat juga kes di mana tidak ada panjang kandungan, iaitu pengekodan chunked digunakan Data dibahagikan kepada satu siri blok dan dihantar, dan setiap blok mempunyai penerangan saiz. Walaupun pelayan tidak mengetahui saiz keseluruhan entiti semasa menjana pengepala (biasanya kerana entiti dijana secara dinamik), pengekodan bongkah masih boleh digunakan untuk menghantar beberapa ketulan saiz yang diketahui.

Pengekodan menggunakan beberapa Ketulan dan diakhiri dengan ketulan yang ditandakan dengan panjang 0. Setiap Ketulan terdiri daripada dua bahagian Bahagian pertama ialah unit panjang dan panjang bagi Ketulan (biasanya tidak ditulis), dan bahagian kedua menyatakan Panjang. Kandungan, setiap bahagian dipisahkan oleh CRLF (nama penuh carriage
return/line feed carriage return/line feed). Kandungan dalam Potongan terakhir dengan panjang 0 dipanggil pengaki, iaitu beberapa maklumat Pengepala tambahan (biasanya boleh diabaikan terus).

Selain itu, pengepala mesej HTTP dan badan mesej dipisahkan oleh CRLF (carriage return and line feed), rnrn

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan