diff --git a/compressConn.go b/compressConn.go index 477a616..8693dc4 100644 --- a/compressConn.go +++ b/compressConn.go @@ -50,29 +50,6 @@ func GetCompressionByte(decode string) (byte, error) { } } -var compressionData = map[byte]compression{ - 40: { - name: "zstd", - openReader: newZstdReader, - openWriter: newZstdWriter, - }, - 255: { - name: "s2", - openReader: newSnappyReader, - openWriter: newSnappyWriter, - }, - 92: { - name: "flate", - openReader: newFlateReader, - openWriter: newFlateWriter, - }, - 93: { - name: "minlz", - openReader: newMinlzReader, - openWriter: newMinlzWriter, - }, -} - func NewCompressionWithByte(b byte) (Compression, error) { c, ok := compressionData[b] if !ok { @@ -106,7 +83,7 @@ func NewCompressionWithByte(b byte) (Compression, error) { func NewCompression(decode string) (Compression, error) { decode = strings.ToLower(decode) for b, c := range compressionData { - if c.String() == decode { + if c.name == decode { return NewCompressionWithByte(b) } } @@ -140,7 +117,10 @@ func (obj *CompressionConn) Write(b []byte) (n int, err error) { return obj.w.Write(b) } func (obj *CompressionConn) Close() error { - return obj.conn.Close() + err := obj.conn.Close() + obj.w.Close() + obj.r.Close() + return err } func (obj *CompressionConn) LocalAddr() net.Addr { diff --git a/compressionPool.go b/compressionPool.go index b3f0836..76ac6f7 100644 --- a/compressionPool.go +++ b/compressionPool.go @@ -10,130 +10,191 @@ import ( "github.com/minio/minlz" ) -// zstd pool -var zstdWriterPool = sync.Pool{ - New: func() any { - c, _ := zstd.NewWriter(nil, zstd.WithWindowSize(32*1024)) - return c - }, +type compreData struct { + rpool *sync.Pool + wpool *sync.Pool + name string + openReader func(r io.Reader) (io.ReadCloser, error) + openWriter func(w io.Writer) (io.WriteCloser, error) +} + +var compressionData map[byte]compreData + +func init() { + compressionData = map[byte]compreData{ + 40: { + name: "zstd", + rpool: &sync.Pool{New: func() any { return nil }}, + wpool: &sync.Pool{New: func() any { return nil }}, + openReader: newZstdReader, + openWriter: newZstdWriter, + }, + 255: { + name: "s2", + rpool: &sync.Pool{New: func() any { return nil }}, + wpool: &sync.Pool{New: func() any { return nil }}, + openReader: newSnappyReader, + openWriter: newSnappyWriter, + }, + 92: { + name: "flate", + rpool: &sync.Pool{New: func() any { return nil }}, + wpool: &sync.Pool{New: func() any { return nil }}, + openReader: newFlateReader, + openWriter: newFlateWriter, + }, + 93: { + name: "minlz", + rpool: &sync.Pool{New: func() any { return nil }}, + wpool: &sync.Pool{New: func() any { return nil }}, + openReader: newMinlzReader, + openWriter: newMinlzWriter, + }, + } } func newZstdWriter(w io.Writer) (io.WriteCloser, error) { - z := zstdWriterPool.Get().(*zstd.Encoder) - z.Reset(w) + pool := compressionData[40].wpool + cp := pool.Get() + var z *zstd.Encoder + var err error + if cp == nil { + z, err = zstd.NewWriter(w, zstd.WithWindowSize(32*1024)) + } else { + z = cp.(*zstd.Encoder) + z.Reset(w) + } + if err != nil { + return nil, err + } return newWriterCompression(z, func() { z.Reset(nil) - zstdWriterPool.Put(z) + pool.Put(z) }), nil } - -var zstdReaderPool = sync.Pool{ - New: func() any { - w, _ := zstd.NewReader(nil) - return w - }, -} - func newZstdReader(w io.Reader) (io.ReadCloser, error) { - z := zstdReaderPool.Get().(*zstd.Decoder) - z.Reset(w) + pool := compressionData[40].rpool + cp := pool.Get() + var z *zstd.Decoder + var err error + if cp == nil { + z, err = zstd.NewReader(w) + } else { + z = cp.(*zstd.Decoder) + z.Reset(w) + } + if err != nil { + return nil, err + } return newReaderCompression(io.NopCloser(z), func() { z.Reset(nil) - zstdReaderPool.Put(z) + pool.Put(z) }), nil } // snappy pool -var snappyWriterPool = sync.Pool{ - New: func() any { - return snappy.NewBufferedWriter(nil) - }, -} func newSnappyWriter(w io.Writer) (io.WriteCloser, error) { - s := snappyWriterPool.Get().(*snappy.Writer) - s.Reset(w) - return newWriterCompression(s, func() { - s.Reset(nil) - snappyWriterPool.Put(s) + pool := compressionData[255].wpool + cp := pool.Get() + var z *snappy.Writer + if cp == nil { + z = snappy.NewBufferedWriter(w) + } else { + z = cp.(*snappy.Writer) + z.Reset(w) + } + return newWriterCompression(z, func() { + z.Reset(nil) + pool.Put(z) }), nil } - -var snappyReaderPool = sync.Pool{ - New: func() any { - return snappy.NewReader(nil) - }, -} - func newSnappyReader(w io.Reader) (io.ReadCloser, error) { - s := snappyReaderPool.Get().(*snappy.Reader) - s.Reset(w) - return newReaderCompression(io.NopCloser(s), func() { - s.Reset(nil) - snappyReaderPool.Put(s) + pool := compressionData[255].rpool + cp := pool.Get() + var z *snappy.Reader + if cp == nil { + z = snappy.NewReader(w) + } else { + z = cp.(*snappy.Reader) + z.Reset(w) + } + return newReaderCompression(io.NopCloser(z), func() { + z.Reset(nil) + pool.Put(z) }), nil } // flate pool -var flateWriterPool = sync.Pool{ - New: func() any { - w, _ := flate.NewWriter(nil, flate.DefaultCompression) - return w - }, -} - func newFlateWriter(w io.Writer) (io.WriteCloser, error) { - f := flateWriterPool.Get().(*flate.Writer) - f.Reset(w) - return newWriterCompression(f, func() { - f.Reset(nil) - flateWriterPool.Put(f) + pool := compressionData[92].wpool + cp := pool.Get() + var z *flate.Writer + var err error + if cp == nil { + z, err = flate.NewWriter(w, flate.DefaultCompression) + } else { + z = cp.(*flate.Writer) + z.Reset(w) + } + if err != nil { + return nil, err + } + return newWriterCompression(z, func() { + z.Reset(nil) + pool.Put(z) }), nil } -var flateReaderPool = sync.Pool{ - New: func() any { - return flate.NewReader(nil) - }, -} - func newFlateReader(w io.Reader) (io.ReadCloser, error) { - r := flateReaderPool.Get().(io.ReadCloser) - f := r.(flate.Resetter) - err := f.Reset(w, nil) - return newReaderCompression(r, func() { + pool := compressionData[92].rpool + cp := pool.Get() + var z io.ReadCloser + var f flate.Resetter + if cp == nil { + z = flate.NewReader(w) + f = z.(flate.Resetter) + } else { + z = cp.(io.ReadCloser) + f = z.(flate.Resetter) + f.Reset(w, nil) + } + return newReaderCompression(z, func() { f.Reset(nil, nil) - flateReaderPool.Put(r) - }), err + pool.Put(z) + }), nil } // minlz pool -var minlzWriterPool = sync.Pool{ - New: func() any { - return minlz.NewWriter(nil, minlz.WriterBlockSize(32*1024)) - }, -} func newMinlzWriter(w io.Writer) (io.WriteCloser, error) { - m := minlzWriterPool.Get().(*minlz.Writer) - m.Reset(w) - return newWriterCompression(m, func() { - m.Reset(nil) - minlzWriterPool.Put(m) + pool := compressionData[93].wpool + cp := pool.Get() + var z *minlz.Writer + if cp == nil { + z = minlz.NewWriter(w, minlz.WriterBlockSize(32*1024)) + } else { + z = cp.(*minlz.Writer) + z.Reset(w) + } + return newWriterCompression(z, func() { + z.Reset(nil) + pool.Put(z) }), nil } -var minlzReaderPool = sync.Pool{ - New: func() any { - return minlz.NewReader(nil, minlz.ReaderMaxBlockSize(32*1024)) - }, -} - func newMinlzReader(w io.Reader) (io.ReadCloser, error) { - m := minlzReaderPool.Get().(*minlz.Reader) - m.Reset(w) - return newReaderCompression(io.NopCloser(m), func() { - m.Reset(nil) - minlzReaderPool.Put(m) + pool := compressionData[93].rpool + cp := pool.Get() + var z *minlz.Reader + if cp == nil { + z = minlz.NewReader(w, minlz.ReaderMaxBlockSize(32*1024)) + } else { + z = cp.(*minlz.Reader) + z.Reset(w) + } + return newReaderCompression(io.NopCloser(z), func() { + z.Reset(nil) + pool.Put(z) }), nil } diff --git a/flate.go b/flate.go deleted file mode 100644 index 910fa20..0000000 --- a/flate.go +++ /dev/null @@ -1,20 +0,0 @@ -package requests - -// var flateWriterPool = sync.Pool{ -// New: func() interface{} { -// w, _ := flate.NewWriter(io.Discard, flate.DefaultCompression) -// return w -// }, -// } - -// func getFlateWriter(dst io.Writer) *flate.Writer { -// w := flateWriterPool.Get().(*flate.Writer) -// w.Reset(dst) -// return w -// } - -// func putFlateWriter(w *flate.Writer) { -// // w.Close() // flush buffer -// w.Reset(io.Discard) -// flateWriterPool.Put(w) -// } diff --git a/go.mod b/go.mod index b0d307b..124a857 100644 --- a/go.mod +++ b/go.mod @@ -9,12 +9,12 @@ require ( github.com/gospider007/bs4 v0.0.0-20250413121342-fed910fb00c9 github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a - github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef - github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7 + github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d + github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015 github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686 github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c - github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064 + github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823 github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9 github.com/klauspost/compress v1.18.0 github.com/minio/minlz v1.0.1 @@ -81,7 +81,7 @@ require ( go.uber.org/zap v1.27.0 // indirect go.uber.org/zap/exp v0.3.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/exp v0.0.0-20250808145144-a408d31f581a // indirect + golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 // indirect golang.org/x/image v0.30.0 // indirect golang.org/x/mod v0.27.0 // indirect golang.org/x/sync v0.16.0 // indirect diff --git a/go.sum b/go.sum index 986b593..a8e77b8 100644 --- a/go.sum +++ b/go.sum @@ -114,10 +114,10 @@ github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd h1:aby4HnAGVJt5pI github.com/gospider007/gson v0.0.0-20250718004537-ff15820964bd/go.mod h1:GxCATDh+u/TLHTAI9p1kXfaGUkVNjHuY+Mhxdo4l5k8= github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a h1:FdBSNOy8cLM4WYkvWgQJVoi++OwkNtsipuRcxyb5d9Q= github.com/gospider007/gtls v0.0.0-20250801033740-1ebcdc3aaa9a/go.mod h1:iTnRK0DU3YH7MlZZ9VdT5gQAFPKzHRtFi3EXpnosOAM= -github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef h1:Ag8TrazSH1sVxVMjCOY3laRcorBiceseB3PcNvqJDbE= -github.com/gospider007/http1 v0.0.0-20250806001143-d0669acd99ef/go.mod h1:fnyx2omi7IYVdfKxfkAUR240Au/EKZ+HruhXw2EOrdg= -github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7 h1:o0S6ZZwnTrDwuDnRZkA0dIPsRuBe9vTlazb6+j/taR0= -github.com/gospider007/http2 v0.0.0-20250805092410-87c07ed55dc7/go.mod h1:9heGY5Ue/tgXRZWbPYjP7+0ccZcv+4FBH1gKANCy5Q4= +github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d h1:Yc8WmHlw6LMUz7AGOq9OmoZtj+yCFLpUZpACuRrKn4s= +github.com/gospider007/http1 v0.0.0-20250811065845-3171c31c920d/go.mod h1:3dzikZkFrwB7IZVxAPikUjvlnArjxIREskI75fXpMW0= +github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015 h1:w4iI0F5Di8sfa0YPHBBqmEdbwh8AuSv5aUmoIcTDLgk= +github.com/gospider007/http2 v0.0.0-20250813025441-3ca7313b9015/go.mod h1:YgO4bbAuSaSLzLeugPzEplsQ649pv/GsahWLiWRARBg= github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686 h1:1DgqAbiUoZueBEO4Ti5uqqKE60SagebEzKNh1tzpWcI= github.com/gospider007/http3 v0.0.0-20250811065920-4ec9b14f9686/go.mod h1:g5v7nxLoHAXT5FMbU+m2Q43oiNiAp0MDdcI+lqb2+vs= github.com/gospider007/ja3 v0.0.0-20250724085013-aa7e0a527d6c h1:Ksw8S50iGK0dqYmScPRn/oOuKegHJ2j9DupSURZZmoI= @@ -126,8 +126,8 @@ github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d h1:+Fih572EdNmYC github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d/go.mod h1:3u6J+nbdWhCNJGiQjq/hKSukn2k6ebjd98rd2+fzKNo= github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c h1:8/Cf+c2680tkWJ+ueZ9RLLK5R5R8nhE8pNBUPHjkvkM= github.com/gospider007/re v0.0.0-20250217075352-bcb79f285d6c/go.mod h1:dd8aDIUG1vDPP5r+vHBtiUK0Zn6uk3SsWt1ZvmCCHLs= -github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064 h1:zmdLFUzG87xgpDp6JnTr73t1f+LtOLufiL7dPT2nPVQ= -github.com/gospider007/tools v0.0.0-20250730001814-2c13a4717064/go.mod h1:i0V5k/zJW/ghTLLWY40pwTVuwa/Gxm2Q1IP1vQYHBX8= +github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823 h1:ZjQlAF1MyaX3gLwJy3sfiS3p90nlaQ7gGlEimBX/Nws= +github.com/gospider007/tools v0.0.0-20250811070046-82a1a8f96823/go.mod h1:49t4VTyJasJTs7SR2SyhkXkB7VctL9VE1TCY10fqlH0= github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9 h1:wr8I0a7B39o4TsKthOlA/hKeCkKntToIxyRsEqbcmDo= github.com/gospider007/websocket v0.0.0-20250730005216-580a061173b9/go.mod h1:tV+/Xly2dOtGs8J5FfJRKD8NA5YTkVe78uKytVuhs58= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -285,8 +285,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20250808145144-a408d31f581a h1:Y+7uR/b1Mw2iSXZ3G//1haIiSElDQZ8KWh0h+sZPG90= -golang.org/x/exp v0.0.0-20250808145144-a408d31f581a/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4= +golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4= diff --git a/response.go b/response.go index b0a3c90..080fcd4 100644 --- a/response.go +++ b/response.go @@ -158,7 +158,7 @@ func (obj *Response) WebSocket() *websocket.Conn { if obj.StatusCode() != 101 { return nil } - obj.webSocket = websocket.NewConn(newFakeConn(obj.rawBody.Stream()), func() { obj.CloseConn() }, true, obj.Headers().Get("Sec-WebSocket-Extensions")) + obj.webSocket = websocket.NewConn(newFakeConn(obj.rawBody.Stream()), true, obj.Headers().Get("Sec-WebSocket-Extensions")) return obj.webSocket } diff --git a/roundTripper.go b/roundTripper.go index 32cac2d..3460958 100644 --- a/roundTripper.go +++ b/roundTripper.go @@ -132,17 +132,7 @@ func (obj *roundTripper) ghttp3Dial(ctx *Response, remoteAddress Address, proxyA if err != nil { return nil, err } - cctx, ccnl := context.WithCancelCause(obj.ctx) - conn = http3.NewConn(cctx, netConn, udpConn, func() { - ccnl(errors.New("http3 client close")) - }) - if ct, ok := udpConn.(interface { - SetTcpCloseFunc(f func(error)) - }); ok { - ct.SetTcpCloseFunc(func(err error) { - ccnl(errors.New("http3 client close with udp")) - }) - } + conn = http3.NewConn(obj.ctx, netConn, udpConn) return } @@ -182,17 +172,7 @@ func (obj *roundTripper) uhttp3Dial(ctx *Response, remoteAddress Address, proxyA if err != nil { return nil, err } - cctx, ccnl := context.WithCancelCause(obj.ctx) - conn = http3.NewConn(cctx, netConn, udpConn, func() { - ccnl(errors.New("http3 client close")) - }) - if ct, ok := udpConn.(interface { - SetTcpCloseFunc(f func(error)) - }); ok { - ct.SetTcpCloseFunc(func(err error) { - ccnl(errors.New("uhttp3 client close with udp")) - }) - } + conn = http3.NewConn(obj.ctx, netConn, udpConn) return } @@ -270,19 +250,14 @@ func (obj *roundTripper) dial(ctx *Response) (conn http1.Conn, err error) { return obj.dialConnecotr(ctx, rawConn, h2) } func (obj *roundTripper) dialConnecotr(ctx *Response, rawCon net.Conn, h2 bool) (conn http1.Conn, err error) { - cctx, ccnl := context.WithCancelCause(obj.ctx) if h2 { var spec *http2.Spec if ctx.option.gospiderSpec != nil { spec = ctx.option.gospiderSpec.H2Spec } - conn, err = http2.NewConn(cctx, ctx.Context(), rawCon, spec, func(err error) { - ccnl(tools.WrapError(err, "http2 client close")) - }) + conn, err = http2.NewConn(obj.ctx, ctx.Context(), rawCon, spec) } else { - conn = http1.NewConn(cctx, rawCon, func(err error) { - ccnl(tools.WrapError(err, "http1 client close")) - }) + conn = http1.NewConn(obj.ctx, rawCon) } return } diff --git a/socks5.go b/socks5.go index 75801d8..5c6fe43 100644 --- a/socks5.go +++ b/socks5.go @@ -101,7 +101,6 @@ type UDPConn struct { bufWrite [MaxUdpPacket]byte proxyAddress net.Addr remoteAddress Address - tcpCloseFunc func(error) } func NewUDPConn(tcpConn net.Conn, packConn net.PacketConn, proxyAddress net.Addr, remoteAddress Address) *UDPConn { @@ -113,10 +112,8 @@ func NewUDPConn(tcpConn net.Conn, packConn net.PacketConn, proxyAddress net.Addr prefix: []byte{0, 0, 0}, } go func() { - _, err := tools.Copy(io.Discard, tcpConn) - if ucon.tcpCloseFunc != nil { - ucon.tcpCloseFunc(err) - } + tools.Copy(io.Discard, tcpConn) + ucon.Close() }() return ucon } @@ -173,9 +170,6 @@ func (c *UDPConn) SetWriteBuffer(i int) error { return nil } -func (c *UDPConn) SetTcpCloseFunc(f func(error)) { - c.tcpCloseFunc = f -} func (c *UDPConn) Close() error { c.tcpConn.Close() return c.PacketConn.Close() diff --git a/test/protocol/sse_test.go b/test/protocol/sse_test.go index 99125e7..0483f9c 100644 --- a/test/protocol/sse_test.go +++ b/test/protocol/sse_test.go @@ -13,7 +13,7 @@ import ( func TestSse(t *testing.T) { // Start the server go func() { - err := http.ListenAndServe(":3333", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + err := http.ListenAndServe(":3334", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") @@ -47,7 +47,7 @@ func TestSse(t *testing.T) { } }() time.Sleep(time.Second * 3) - response, err := requests.Get(nil, "http://127.0.0.1:3333/events") // Send WebSocket request + response, err := requests.Get(nil, "http://127.0.0.1:3334/events") // Send WebSocket request if err != nil { t.Error(err) } diff --git a/test/protocol/websocket_test.go b/test/protocol/websocket_test.go index b10a281..cf5a551 100644 --- a/test/protocol/websocket_test.go +++ b/test/protocol/websocket_test.go @@ -14,38 +14,38 @@ import ( var wsOk bool -func websocketServer() { - if wsOk { - return - } +func websocketServer(addr string) { var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许跨域 }, } - http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { - conn, err := upgrader.Upgrade(w, r, nil) - if err != nil { - return - } - defer conn.Close() + if !wsOk { - for { - messageType, message, err := conn.ReadMessage() + http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { + conn, err := upgrader.Upgrade(w, r, nil) if err != nil { - break + return } - conn.WriteMessage(messageType, []byte("服务端回复:"+string(message))) - } - }) - log.Println("WebSocket 服务器启动于 ws://localhost:8080/ws") + defer conn.Close() + + for { + messageType, message, err := conn.ReadMessage() + if err != nil { + break + } + conn.WriteMessage(messageType, []byte("服务端回复:"+string(message))) + } + }) + } wsOk = true - log.Fatal(http.ListenAndServe(":8800", nil)) + log.Printf("WebSocket 服务器启动于 ws://127.0.0.1%s/ws", addr) + log.Fatal(http.ListenAndServe(addr, nil)) } func TestWebSocket(t *testing.T) { - go websocketServer() + go websocketServer(":8806") time.Sleep(time.Second * 1) // Send WebSocket request - response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true}) // Send WebSocket request + response, err := requests.Get(nil, "ws://127.0.0.1:8806/ws", requests.RequestOption{DisProxy: true}) // Send WebSocket request if err != nil { log.Panic(err) } @@ -80,9 +80,10 @@ func TestWebSocket(t *testing.T) { } } func TestWebSocketClose(t *testing.T) { - go websocketServer() - time.Sleep(time.Second * 1) // Send WebSocket request - response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request + time.Sleep(time.Second * 1) // Send WebSocket request + go websocketServer(":8809") + time.Sleep(time.Second * 5) // Send WebSocket request + response, err := requests.Get(nil, "ws://127.0.0.1:8809/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request if err != nil { log.Panic(err) } @@ -101,9 +102,9 @@ func TestWebSocketClose(t *testing.T) { } } func TestWebSocketClose2(t *testing.T) { - go websocketServer() + go websocketServer(":8802") time.Sleep(time.Second * 1) // Send WebSocket request - response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request + response, err := requests.Get(nil, "ws://127.0.0.1:8802/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request if err != nil { log.Panic(err) } @@ -124,9 +125,9 @@ func TestWebSocketClose2(t *testing.T) { } } func TestWebSocketClose3(t *testing.T) { - go websocketServer() + go websocketServer(":8803") time.Sleep(time.Second * 1) // Send WebSocket request - response, err := requests.Get(nil, "ws://localhost:8800/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request + response, err := requests.Get(nil, "ws://127.0.0.1:8803/ws", requests.RequestOption{DisProxy: true, Stream: true}) // Send WebSocket request if err != nil { log.Panic(err) }