慕容森
因为我只想在写入停止时断开连接(并且很快,以便我可以记录到目前为止收到的数据并允许客户端恢复),所以 ReadTimeout 对我来说不是正确的解决方案。我在这个要点中找到了答案。您需要在连接本身上设置读取。包网络超时import ( "net" "time")// Listener wraps a net.Listener, and gives a place to store the timeout// parameters. On Accept, it will wrap the net.Conn with our own Conn for us.type Listener struct { net.Listener ReadTimeout time.Duration WriteTimeout time.Duration}func (l *Listener) Accept() (net.Conn, error) { c, err := l.Listener.Accept() if err != nil { return nil, err } tc := &Conn{ Conn: c, ReadTimeout: l.ReadTimeout, WriteTimeout: l.WriteTimeout, } return tc, nil}// Conn wraps a net.Conn, and sets a deadline for every read// and write operation.type Conn struct { net.Conn ReadTimeout time.Duration WriteTimeout time.Duration}func (c *Conn) Read(b []byte) (int, error) { err := c.Conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)) if err != nil { return 0, err } return c.Conn.Read(b)}func (c *Conn) Write(b []byte) (int, error) { err := c.Conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) if err != nil { return 0, err } return c.Conn.Write(b)}func NewListener(addr string, readTimeout, writeTimeout time.Duration) (net.Listener, error) { l, err := net.Listen("tcp", addr) if err != nil { return nil, err } tl := &Listener{ Listener: l, ReadTimeout: readTimeout, WriteTimeout: writeTimeout, } return tl, nil}