2017-07-07 44 views
2

或者如何检查它是否可用于循环中的ReadWrite?如果conn关闭或不可用,我们应该停止循环。如何检查net.Conn已关闭?

例如:

package main 

import "net" 

func main() { 
    conn, err := net.Dial("tcp", "127.0.0.1:1111") 
    defer conn.Close() 
    for { 
     buf := make([]byte, 1, 1) 
     n, err := conn.Read(buf) 
     if err != nil { 
      // currently we can only stop the loop 
      // when occur any errors 
      log.Fatal(err) 
     } 
    } 
} 

回答

1

你可以得到一些错误,这取决于连接如何关闭。从Read收到的唯一错误是io.EOFio.EOF是指示连接正常关闭的值。

其他错误可以针对其TimeoutTemporary方法的net.Error接口进行检查。这些通常是net.OpError类型。从Write返回的任何非临时错误都是致命的,因为它表示写入无法成功,但请注意,由于基础网络API,写入返回无错误仍不能保证成功。

一般来说,你可以按照io.Reader api。

当Read在成功读取n> 0个字节后遇到错误或文件结束条件时,它会返回读取的字节数。它可能会从相同的调用中返回(非零)错误,或者从后续调用中返回错误(和n == 0)。这种一般情况的一个实例是,在输入流末尾返回非零字节数的Reader可能会返回err == EOF或err == nil。下一个Read应该返回0,EOF。

如果有数据读取,您首先处理。处理完数据后,您可以在出现任何错误时从循环中断开。如果它是io.EOF,则连接将正常关闭,并且您认为适合的任何其他错误都可以处理。

+1

请注意,这仅涵盖读取。写入不应该返回'io.EOF'。 – Adrian