2 回答

TA貢獻1829條經(jīng)驗 獲得超6個贊
如果您唯一的選擇是讀取行直到超時,您可以在第一次讀取完成后在連接上設置讀取截止日期。然后,您可以攔截超時錯誤,并將其轉(zhuǎn)換為 EOF,以便緩沖閱讀器正確解釋您的意圖。
type timeoutReader struct {
net.Conn
once sync.Once
}
func (r *timeoutReader) Read(b []byte) (int, error) {
n, err := r.Conn.Read(b)
// Set a read deadline only after the first Read completes
r.once.Do(func() {
r.Conn.SetReadDeadline(time.Now().Add(3 * time.Second))
})
// If we got a timeout, treat it as an io.EOF so the bufio.Scanner handles
// the error as if it was the normal end of the stream.
var netErr net.Error
if errors.As(err, &netErr) && netErr.Timeout() {
return n, io.EOF
}
return n, err
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:15000")
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(&timeoutReader{Conn: conn})
message := ""
for scanner.Scan() {
message += scanner.Text()
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
log.Println(message)
}

TA貢獻1803條經(jīng)驗 獲得超3個贊
如果條件是收到第一行后3秒超時,解決辦法是收到第一行后3秒關(guān)閉socket。
var firstLineReceived bool
conn, err := net.Dial("tcp", "127.0.0.1:15000")
reader := bufio.NewReader(conn)
message := ""
for {
line, err := reader.ReadString('\n')
if err == io.EOF {
break
}
message += line
if !firstLineReceived {
firstLineReceived = true
go func(){
time.Sleep(3*time.Second)
conn.Close()
}()
}
}
log.Println(message)
- 2 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報