Golang基础——net包的使用:tcp链接

100 阅读2分钟

TCP链接的一些基础操作

如下为一个客户端链接服务端,并在服务端打印链接地址的例子

服务端

func main() {
   addr, err := net.ResolveTCPAddr("tcp", ":8080")//建立一个tcp链接
   if err!=nil{
      //异常处理
      return
   }
   tcp, err := net.ListenTCP("tcp", addr)//对链接进行监听
   if err!=nil {
      //异常处理
      return
   }

   for {
      conn, err := tcp.AcceptTCP()//不断接受客户端的链接
      if err != nil {
         //异常处理
         return
      }
      go handleConnection(conn)
   }

}
func handleConnection(conn *net.TCPConn) {
   fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
}

客户端

func main() {
   addr, err := net.ResolveTCPAddr("tcp", ":8080")//建立tcp链接
   if err!=nil{
      //异常处理
      return
   }
   
   net.DialTCP("tcp", nil, addr)//链接到服务端
}

效果如下

image.png

接下来向服务端固定发生一串字符:请求出战

服务端

在处理链接函数上进行改进

func handleConnection(conn *net.TCPConn) {
   buff:= make([]byte, 1024)
   read, _ := conn.Read(buff)
   fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
   fmt.Println(conn.RemoteAddr().String() + "" + string(buff[:read]))
}

客户端

func main() {
   addr, err := net.ResolveTCPAddr("tcp", ":8080")
   if err!=nil{
      return
   }
   tcp, _ := net.DialTCP("tcp", nil, addr)
   tcp.Write([]byte("请求出战"))
}

效果如下

image.png

在客户端进行输入发送给服务端

服务端

不做改变

客户端

func main() {
   addr, err := net.ResolveTCPAddr("tcp", ":8080")
   if err!=nil{
      return
   }
   tcp, _ := net.DialTCP("tcp", nil, addr)
   reader := bufio.NewReader(os.Stdin)
   line, _, _ := reader.ReadLine()
   tcp.Write(line)
}

效果如下

image.png

接下来将他们改进,是他们可以长时间相互接受发送信息

服务端

同样的只需在链接处理函数中进行改进即可

func handleConnection(conn *net.TCPConn) {
   for  {//实现长时间接收以及返回信息
      buff:= make([]byte, 1024)
      read, err := conn.Read(buff)
      if err!=nil {
         fmt.Println(conn.RemoteAddr().String() + "断开了链接")
         return
      }
      fmt.Println("来自:" + conn.RemoteAddr().String() + "的链接")
      fmt.Println(conn.RemoteAddr().String() + "对你说:" + string(buff[:read]))
      s:= "服务端收到了你发送的消息:" + string(buff[:read])
      conn.Write([]byte(s))//给客户端返回信息
   }
}

客户端

func main() {
   addr, err := net.ResolveTCPAddr("tcp", ":8080")
   if err!=nil{
      return
   }
   tcp, _ := net.DialTCP("tcp", nil, addr)
   reader := bufio.NewReader(os.Stdin)
   for  {//实现长时间接收以及发送信息
      line, _, _ := reader.ReadLine()
      tcp.Write(line)
      buff := make([]byte, 1024)
      read, _ := tcp.Read(buff)
      fmt.Println(string(buff[:read]))//打印服务端返回的信息
   }
}

效果如下

服务端效果

image.png

客户端效果

image.png
本文正在参加技术专题18期-聊聊Go语言框架