net / http:读取时出现“使用封闭的网络连接”错误

问题描述 投票:0回答:1

server.go

func main(){
    fmt.Println("服务端开始监听。。。")
    listen,err := net.Listen("tcp","127.0.0.1:8999")
    if err!=nil{
        fmt.Println("listening err: ",err)
        return
    }
    defer listen.Close()
    // 等待客户端来连接
    for{
        fmt.Println("等待客户端来连接。。。")
        conn,err := listen.Accept()
        if err!=nil{
            fmt.Println("Accept() err: ",err)
            return
        }else{
            fmt.Println("Accept() suc con=%v 客户端ip=%v \n",conn,conn.RemoteAddr().String())
        }
        // 准备一个协程,服务客户端
        go process(conn)
    }
}

func process(conn net.Conn)  {
    conn.Close()
    // 循环的接受客户端发送的消息
    for{
        buf:=make([]byte,1024)
        // 等待客户端通过conn发送消息,如果没有write发送,协程阻塞在这里
        n,err:=conn.Read(buf)
        if err!=nil{
            fmt.Println(n,err)
            return
        }
        // 显示客户端发送的消息到终端
        fmt.Print(string(buf[:n]))
    }
}

client.go

func main()  {
    conn,err := net.Dial("tcp","127.0.0.1:8999")
    if err!=nil{
        fmt.Println("Dial() err:",err)
        return
    }
    // 功能一:客户端发送单行数据,退出
    reader := bufio.NewReader(os.Stdin) // 获取标准输入
    for{
        // 从终端读入一行输入
        line,err := reader.ReadString('\n')
        if err!=nil{
            fmt.Println("ReadString() err:",err)
            return
        }
        line = strings.Trim(line,"\r\n")
        if line=="exit"{
            fmt.Println("客户端退出...")
            break
        }
        // 将消息发送给服务端
        _,err = conn.Write([]byte(line+"\n"))
        if err!=nil{
            fmt.Println("Write() err:",err)
            return
        }
    }
}
netstat -an | grep 8999
  TCP    127.0.0.1:8999         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:8999         127.0.0.1:55362        FIN_WAIT_2
  TCP    127.0.0.1:55362        127.0.0.1:8999         CLOSE_WAIT

go版本go1.14 Windows / amd64

运行go run server.go启动服务器,一切正常,但是go run client.go启动客户端出现错误:

0读取tcp 127.0.0.1:8999->127.0.0.1:55362:使用封闭的网络连接

怎么了?

我试图弄清楚这是否意味着客户端在writePump函数期间已断开连接?发生这种情况时,似乎断开了所有用户的连接。

go tcp goroutine
1个回答
0
投票

defer conn.Close(),由于我的粗心大意

© www.soinside.com 2019 - 2024. All rights reserved.