在Go语言中,如何在不创建临时字节切片的情况下从连接中读取数据呢?

huangapple go评论77阅读模式
英文:

How do you read from a connection without creating a temp byte slice in Go

问题

将发送到我的net.Conn的数据是使用TCP网络的数据包。这些数据包的大小都不同。我应该如何创建一个与传入数据大小完全相同的缓冲区?
目前,我正在分配一个具有可能的最大数据包大小的字节切片,然后再次对其进行切片。

for {
    data := make([]byte, 2097151)
    r, _ := (*c).Read(data)
    data = data[:r]
}

以下是翻译好的内容:

发送到net.Conn的数据是使用TCP网络的数据包。这些数据包的大小各不相同。我应该如何创建一个与传入数据大小完全相同的缓冲区?
目前,我正在分配一个具有可能的最大数据包大小的字节切片,然后再次对其进行切片。

for {
    data := make([]byte, 2097151)
    r, _ := (*c).Read(data)
    data = data[:r]
}
英文:

The data being sent to my net.Conn are packets using TCP network. These packets are all different sizes. How would I make a buffer that's the exact size of the data coming in?
Currently I'm allocating a byte slice which has the biggest packet possible and then slicing it again.

for{
	data := make([]byte, 2097151)
	r, _ := (*c).Read(data)
	data = data[:r]
}

答案1

得分: 2

你可以使用bufio来从客户端读取数据。

一个基本的示例:

func TCPServerReadFromConnection() {
	server, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer server.Close()

	conn, err := server.Accept()
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// 这是一个用于接收连接上的数据的扫描器
	scanner := bufio.NewScanner(conn)

	for scanner.Scan() {
		val := scanner.Text()
		fmt.Println(val)
	}
}
英文:

You can use bufio to read from client

A basic example

func TCPServerReadFromConnection() {
	server, err := net.Listen("tcp", ":8080")
	if err != nil {
		panic(err)
	}
	defer server.Close()

	conn, err := server.Accept()
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// This is a scanner for accepting the data coming over connection
	scanner := bufio.NewScanner(conn)

	for scanner.Scan() {
		val := scanner.Text()
		fmt.Println(val)
	}
}

huangapple
  • 本文由 发表于 2021年6月17日 08:57:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/68011608.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定