Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Saya Mengakses Soket Dasar dalam Respons net/http Go?
Mendapatkan Soket Pendasar dalam Go's net/http Response
Pakej net/http Go menyediakan rangka kerja yang mudah untuk membina pelayan HTTP. Walau bagaimanapun, mungkin terdapat situasi di mana anda memerlukan akses kepada soket asas aliran respons. Artikel ini menangani keperluan itu dengan meneroka pelbagai pendekatan untuk mendapatkan semula sambungan soket.
Sebelum Pergi 1.13
Sebelum Pergi 1.13, mendapatkan soket asas memerlukan teknik yang lebih terperinci. Berikut ialah dua pendekatan:
Penjejakan Berasaskan Peristiwa (Sambungan TCP Sahaja):
Untuk sambungan melalui port TCP, anda boleh memanfaatkan net.Listener. Pengendali acara ConnState untuk menjejak sambungan aktif dan soket berkaitannya. Maklumat ini boleh disimpan dalam peta global untuk mendapatkan semula kemudian.
<code class="go">var conns = make(map[string]net.Conn) func ConnStateEvent(conn net.Conn, event http.ConnState) { if event == http.StateActive { conns[conn.RemoteAddr().String()] = conn } else if event == http.StateHijacked || event == http.StateClosed { delete(conns, conn.RemoteAddr().String()) } } func GetConn(r *http.Request) (net.Conn) { return conns[r.RemoteAddr] }</code>
Pendengar Overriding (Soket Unix):
Soket Unix memerlukan yang lebih rumit pendekatan kerana mereka kekurangan pengecam unik untuk setiap sambungan. Satu penyelesaian adalah untuk mengatasi net.Listener.Terima kaedah untuk menetapkan rentetan unik pada setiap sambungan dan gunakan ini sebagai kekunci untuk menyimpan maklumat soket.
<code class="go">func NewConnSaveListener(wrap net.Listener) (net.Listener) { return connSaveListener{wrap} } func (self connSaveListener) Accept() (net.Conn, error) { conn, err := self.Listener.Accept() ptrStr := fmt.Sprintf("%d", &conn) conns[ptrStr] = conn return remoteAddrPtrConn{conn, ptrStr}, err } func GetConn(r *http.Request) (net.Conn) { return conns[r.RemoteAddr] }</code>
Pergi 1.13 dan Di luar
Dengan keluaran Go 1.13, penyelesaian yang lebih mudah tersedia:
Storan Berasaskan Konteks:
Bermula dengan Go 1.13, net.Conn boleh disimpan dalam konteks permintaan HTTP. Ini menyediakan cara yang bersih dan cekap untuk mengakses sambungan soket.
<code class="go">type contextKey struct { key string } var ConnContextKey = &contextKey{"http-conn"} func SaveConnInContext(ctx context.Context, c net.Conn) (context.Context) { return context.WithValue(ctx, ConnContextKey, c) } func GetConn(r *http.Request) (net.Conn) { return r.Context().Value(ConnContextKey).(net.Conn) }</code>
Dengan memahami teknik ini, anda boleh mendapatkan semula soket asas dalam pengendali respons net/http anda dengan berkesan, membolehkan tersuai operasi dan kefungsian khusus platform.
Atas ialah kandungan terperinci Bagaimanakah Saya Mengakses Soket Dasar dalam Respons net/http Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!