首页 > 文章列表 > golang中net的tcp服务使用

golang中net的tcp服务使用

golang
223 2022-12-17

服务端监听端口 listen()

方法:net.listen({监听类型},{监听的ip和端口})(conn, err){}

返回值:conn是监听的对象,有获取消息关闭监听等方法err错误信息,如果没有错误信息值为nil

import ("net"

"fmt"

)

conn,err := net.Lisien("tcp","127.0.0.1:8082")

if err != nil{

  fmt.Println("链接失败,错误信息为:"+err)

}

接受客户端的链接conn.Accept()

方法:conn.Accept() (newConn,err){} 返回值: newConn客户端的链接对象,类型为net.Conn.存放了客户端的链接信息,和与客户端交互的方法.err存放错误,如果没有错误信息值为nil 注意点: Accept()方法会阻塞,直到有链接过来

//  ...上面的代码...

// 因为客户端的链接不止一个,需要一直监听,所以加个死循环

for{

    newConn,err := conn.Accept()

    if err != nil{

        fmt.Println(err)

    }

    go handler(newConn)

}

​

// 客户端连接后处理逻辑

func handler(newConn net.Conn){

    // TODO

}

接收客户端发过来的数据newConn.Read()

方法:newConn.Read(msg)(num,err){}

返回值: num数据内容的长度,单位字节err错误信息,如果没有错误信息值为nil

注意点: 参数msg是一个byte类型的切片,用来保存客户端发送的数据。Read方法同样会阻塞!!

// ...上上边代码补充...

// 客户端连接后处理逻辑

func handler(newConn net.Conn){

    for{

        // 新建一个位置用于存放客户端数据

        msg := make([]byte,1024)

        num,err := newConn.Read(msg)

        if err != nil{

            // 打印错误信息

        }

        fmt.Println("客户端消息:"+msg)

    }

    

}

获取客户端的IP地址newConn.RemoteAddr().String()

// 获取ip地址,转为之字符串

newConn.RemoteAddr().String()

向客户端发送数据newConn.Write()

方法:newConn.Write(msg){}

参数:msg类型为[]byte

注意点:需要把待发送的字符串转为byte切片类型

newConn.Write([]bye("你好世界,helloworld1"))

关闭客户端连接newConn.Close()

方法: newConn.Close(){}

在客户端连接的返回的对象上调用Close()方法即可

newConn.Close()

客户端连接tpc服务端

连接服务端net.Dial()

方法: net.Dial({连接类型},{地址})(conn,err){}

放回值: conn连接成功后的连接对象,err连接出错时的错误信息,如果没有错误信息,返回nil

// 建立tcp连接

package main

import (

    "net"

    "fmt"

)

Ip,Port := "127.0.0.1",8081

conn,err := net.Dial("tcp",fmt.Sprintf("%s:%d",Ip,Port))

if err != nil{

    fmt.Println("net.Dial 错误:",err)

    return nil

}

if(conn == nil){

    fmt.Println(">>>>>>>>连接错误")

    return

}

fmt.Println(">>>>>>>>连接成功")

运行: