Go TCP网络通信

TCP 工作在网络的传输层,它属于一种面向连接的可靠的通信协议。

TCP 服务器的工作过程:

  1. TCP 服务器首先注册一个公知端口,然后调用 Listen() 函数在这个端口上创建一个 TCPListener 监听对象,并在该对象上监听客户机的连接请求。
  2. 启用 TCPListener 对象的 Accept() 方法接收客户机的连接请求,并返回一个协议相关的 Conn 对象,这里就是 TCPConn 对象。
  3. 如果返回了一个新的 TCPConn 对象,服务器就可以调用该对象的 Read() 方法接收客户机发来的数据,或者调用 Write() 方法向客户机发送数据了。

主程序

<code>package mainimport(    "server")func main()  {        server := server.NewServer(":8000");      server.Start();}/<code>

服务端定义

<code>package serverimport (     "log"    "net"    "os")type Server struct {    Address   string }func NewServer(address string) *Server{    return &Server{        Address: address,    }}// 开启TCP服务func (this *Server) Start(){        l, err := net.Listen("tcp", this.Address);    checkError(err)    defer l.Close()    log.Printf("Server start: %s\\n", this.Address)    for {        conn, err := l.Accept()        if err != nil {            log.Println(err.Error())            continue        }        go handleConnection(conn);    }}// 连接接收func handleConnection(conn net.Conn){        rAddr := conn.RemoteAddr()    log.Printf("Connect from client: %s\\n", rAddr)     defer conn.Close()    var buf [1036]byte      n, err := conn.Read(buf[0:])    if err != nil {         return    }        msg := string(buf[0:n])    log.Printf("Receive from client: %s length: %d", rAddr, n)}func checkError(err error) {    if err != nil {        log.Printf("Fatal error %s", err.Error())        os.Exit(1)    }}/<code>

客户端测试

客户端的工作过程如下:

  1. TCP 客户机在获取了服务器的服务端口号和服务地址之后,可以调用 DialTCP() 函数向服务器发出连接请求,如果请求成功会返回 TCPConn 对象。
  2. 客户机调用 TCPConn 对象的 Read() 或 Write() 方法,与服务器进行通信活动。
  3. 通信完成后,客户机调用 Close() 方法关闭连接,断开通信链路。
<code>package mainimport(    "fmt"    "net"    "os")func main() {    var buf [512]byte    if len(os.Args) != 2 {        fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])    }    service := os.Args[1]    tcpAddr, err := net.ResolveTCPAddr("tcp", service)    checkError(err)    conn, err := net.DialTCP("tcp", nil, tcpAddr)    checkError(err)      rAddr := conn.RemoteAddr()      n, err := conn.Write([]byte("Hello server"))    checkError(err)      n, err = conn.Read(buf[0:])    checkError(err)    fmt.Println("Reply form server", rAddr.String(), string(buf[0:n]))      conn.Close()    os.Exit(0)}func checkError(err error) {    if err != nil {        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())        os.Exit(1)    }}/<code>


分享到:


相關文章: