使用 Go 的 net.Conn.Read 读取未知长度的数据
在 Go 中使用网络应用程序时,Conn.Read 函数提供从连接的端点检索数据的方法。然而,它使用有限的字节数组进行操作,当内容的长度未知时,这可能并不总是足够。
问题:如何解决这一挑战以精确读取整个可用数据?
答案: 方法的选择取决于应用程序的具体要求和数据的性质。以下是一些可能的解决方案:
使用 bufio
bufio 包提供了多种促进数据缓冲的方法,可用于读取直到文件末尾 (EOF) 。例如,以下代码演示了从套接字连接读取所有数据:
func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") reader := bufio.NewReader(conn) buf, err := ioutil.ReadAll(reader) if err != nil { if err != io.EOF { fmt.Println("read error:", err) } return } fmt.Println("total size:", len(buf)) }
使用 bytes.Buffer
对于需要的应用程序,请考虑使用 bytes.Buffer任意大小的缓冲区。以下修改后的示例演示了这种方法:
func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n") var buf bytes.Buffer io.Copy(&buf, conn) fmt.Println("total size:", buf.Len()) }
注意: 这些解决方案假设连接保持活动状态并且继续接收数据,直到应用程序读取全部数据或到达 EOF。如果连接提前终止,接收到的数据大小可能会不完整。
以上是如何使用Go的net.Conn.Read读取未知长度的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!