Bagaimanakah Saya Mengakses Soket Dasar dalam Respons net/http Go?

Barbara Streisand
Lepaskan: 2024-11-04 12:42:29
asal
674 orang telah melayarinya

How Do I Access the Underlying Socket in Go's net/http Response?

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:

  1. 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>
    Salin selepas log masuk
  2. 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>
    Salin selepas log masuk

Pergi 1.13 dan Di luar

Dengan keluaran Go 1.13, penyelesaian yang lebih mudah tersedia:

  1. 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>
    Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!