Cara Menyelesaikan Ketidakpastian dalam Penghantaran Data Proksi TCP
Apabila mereka bentuk proksi TCP yang memajukan permintaan dan respons antara pelanggan dan pelayan, adalah penting untuk memastikan data dihantar dengan betul. Cabaran utama timbul apabila menentukan sama ada semua maklumat yang diperlukan telah diterima daripada pelayan untuk dimajukan kepada klien.
Satu pendekatan biasa ialah menganggap bahawa apabila operasi baca daripada sambungan pelayan mengembalikan sifar, ia menandakan tamat penghantaran data. Walau bagaimanapun, jika pelayan menulis data ke soket satu bait pada satu masa, proksi mungkin tersilap membuat kesimpulan bahawa ia telah menerima semua data. Ini kerana operasi baca mungkin berlaku dengan pantas, hanya membaca data separa sebelum pelayan selesai menghantar.
Menangani Isu
Untuk menyelesaikan isu ini, langkah yang lebih mantap pendekatan adalah menggunakan penimbalan dan pemasa. Dengan membaca data ke dalam penimbal dan menyemak panjangnya secara berkala, proksi boleh menentukan apabila respons lengkap telah diterima. Pemasa memastikan bahawa proksi tidak menunggu selama-lamanya sekiranya pelayan telah terhenti atau terputus sambungan.
Pertimbangan tambahan ialah potensi untuk partition rangkaian. Jika pelayan menjadi tidak tersedia buat sementara waktu, proksi tidak boleh menganggap ia telah menerima semua data. Sebaliknya, ia harus mengendalikan pengecualian tamat masa dengan sewajarnya untuk mengekalkan kestabilan sambungan.
Pengoptimuman Kod
Kod yang disediakan dalam soalan boleh dioptimumkan dengan menggunakan goroutine yang berasingan untuk setiap arah pemindahan data. Ini membolehkan proksi mengendalikan data secara selari untuk kedua-dua sambungan klien dan pelayan.
Contoh Pelaksanaan
Coretan kod berikut menunjukkan pelaksanaan proksi yang dioptimumkan menggunakan goroutin:
package main import ( "fmt" "net" ) type Proxy struct { ServerConn *net.TCPConn ClientConn *net.TCPConn } func (p *Proxy) Proxy() { fmt.Println("Running proxy...") go func() { _, err := io.Copy(p.ServerConn, p.ClientConn) if err != nil { fmt.Println(err) } }() go func() { _, err := io.Copy(p.ClientConn, p.ServerConn) if err != nil { fmt.Println(err) } }() } func main() { // Initialize the TCP connections serverConn, clientConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 8080}) if err != nil { fmt.Println(err) return } proxy := Proxy{serverConn, clientConn} proxy.Proxy() }
Kod ini lebih cekap dan mengendalikan ralat dengan lebih anggun daripada kod asal yang disediakan kod.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Penghantaran Data Lengkap dalam Proksi TCP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!