啥都不说了,直接上代码
服务端Server
//Server.go
package mainimport ("fmt""net""os"
)func main(){//服务端在本机8888端口建立tcp监听listener,err :=net.Listen("tcp","127.0.0.1:8888")ServerHandleError(err,"net.listen")for {//循环接入所有客户端得到专线连接conn,e := listener.Accept()ServerHandleError(e,"listener.accept")//开辟独立协程与该客聊天go ChatWith(conn)}
}func ServerHandleError(err error,when string) {if err != nil {fmt.Println(err, when)os.Exit(1)}
}//在conn网络专线中与客户端对话
func ChatWith(conn net.Conn){//创建消息缓冲区buffer := make([]byte, 1024)for {///---一个完整的消息回合//读取客户端发来的消息放入缓冲区n,err := conn.Read(buffer)ServerHandleError(err,"conn.read buffer")//转化为字符串输出clientMsg := string(buffer[0:n])fmt.Printf("收到消息",conn.RemoteAddr(),clientMsg)//回复客户端消息if clientMsg != "im off" {conn.Write([]byte("已读:"+clientMsg))} else {conn.Write([]byte("bye"))break}}conn.Close()fmt.Printf("客户端断开连接",conn.RemoteAddr())
}
客户端Client
//Client.go
package mainimport ("bufio""fmt""net""os"
)func ClientHandleError(err error, when string){if err != nil {fmt.Println(err, when)os.Exit(1)}
}func main(){//拨号远程地址,简历tcp连接conn, err := net.Dial("tcp","127.0.0.1:8888")ClientHandleError(err, "client conn error")//预先准备消息缓冲区buffer := make([]byte,1024)//准备命令行标准输入reader := bufio.NewReader(os.Stdin)for {lineBytes,_,_ := reader.ReadLine()conn.Write(lineBytes)n,err := conn.Read(buffer)ClientHandleError(err, "client read error")serverMsg := string(buffer[0:n])fmt.Printf("服务端msg",serverMsg)if serverMsg == "bye" {break}}
}