如何管理golang中Accept()返回的连接?

如何管理golang中Accept()返回的连接?,go,tcp,connection,tcpserver,Go,Tcp,Connection,Tcpserver,对于tcp服务器,我们经常使用Listen()和Accept() 但是有两种方法可以处理Accept返回的连接: 一, 二, 这两种方法正确吗?似乎方法1重用了连接。但是如何向客户指示EOF?这两种方法的作用不同: 第一种方法读取一些数据并将其写回,直到出现错误或读取0字节 第二种方法读取一次,然后写回,然后关闭连接 第一种方法不“重用”连接。它正在实现一个简单的类似echo的协议,该协议一直运行到连接终止。第二种方法回显一次并关闭连接。此答案假设程序的目标是将数据回显到客户端。这个答案包括to

对于tcp服务器,我们经常使用Listen()和Accept()

但是有两种方法可以处理Accept返回的连接:

一,

二,


这两种方法正确吗?似乎方法1重用了连接。但是如何向客户指示EOF?

这两种方法的作用不同:

第一种方法读取一些数据并将其写回,直到出现错误或读取0字节

第二种方法读取一次,然后写回,然后关闭连接


第一种方法不“重用”连接。它正在实现一个简单的类似echo的协议,该协议一直运行到连接终止。第二种方法回显一次并关闭连接。

此答案假设程序的目标是将数据回显到客户端。这个答案包括torek和limon评论中的信息

该文件的内容如下:


Read最多可将len(p)字节读入p。它返回读取的字节数(0)使用
io.Copy(c,c)
来正确执行此操作。关闭连接以指示EOF。(1和2)读取可以返回数据和错误。在处理错误之前写入数据。(2)此程序可能不会从连接中读取所有数据。旁注:在代码部分2中,您有一个
defer c.Close()
因此从(或紧急进入)
handleConnection
返回时将调用
c.Close()
。这意味着您不需要剩余的
c.Close()
调用。
func main() {
    ln, err := net.Listen("tcp", ":6000")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }

        go handleConnection(conn)
    }
}
func handleConnection(c net.Conn) {
    buf := make([]byte, 4096)

    for {
        n, err := c.Read(buf)
        if err != nil || n == 0 {
            c.Close()
            break
        }
        n, err = c.Write(buf[0:n])
        if err != nil {
            c.Close()
            break
        }
    }
    fmt.Printf("Connection from %v closed.\n", c.RemoteAddr())
}
func handleConnection(c net.Conn) {
    defer c.Close()
    buf := make([]byte, 4096)   

    n, err := c.Read(buf)
    if err != nil || n == 0 {
        c.Close()
        break
    }
    n, err = c.Write(buf[0:n])
    if err != nil {
        c.Close()
        break
    }
    fmt.Printf("Connection from %v closed.\n", c.RemoteAddr())
}
func handleConnection(c net.Conn) {
    defer c.Close()
    buf := make([]byte, 4096)

    for {
        n, err := c.Read(buf)
        if err != nil || n == 0 {
            break
        }
        n, err = c.Write(buf[0:n])
        if err != nil {
            break
        }
    }
    fmt.Printf("Connection from %v closed.\n", c.RemoteAddr())
}
func handleConnection(c net.Conn) {
    defer c.Close()
    buf := make([]byte, 4096)

    for {
        n, er := c.Read(buf)
        if n > 0 {
            _, ew := c.Write(buf[:n])
            if ew != nil {
                break
            }
        }
        if er != nil {
            break
        }
    }
    fmt.Printf("Connection from %v closed.\n", c.RemoteAddr())
}
func handleConnection(c net.Conn) {
    defer c.Close()
    io.Copy(c, c)
    fmt.Printf("Connection from %v closed.\n", c.RemoteAddr())
}