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函数期间已断开连接?发生这种情况时,似乎断开了所有用户的连接。
defer conn.Close(),由于我的粗心大意