golang 网络编程(2)TCP

golang_real.jpg

TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

说到网络编程我们先理解一个术语套接字,突破这个术语,我们就向理解 TCP 迈出了一大步。简单比喻一下吧,我们彼此间通过打电话或写信的进行哪种不是面对面的交流,套接字就是我们进行这些交流工具,电话机或是邮箱,仅此而已。

我们今天用 go 语言实现一个 TCP 通讯,go 语言对 TCP 进行封装来方便我们开发 TCP 服务。

package main

import(
    "fmt"
    "io"
    "net"
    "time"
)

func main()  {
    ln, err := net.Listen("tcp",":9000")
    if err != nil{
        panic(err)
    }
    defer ln.Close()

    for{
        conn, err := ln.Accept()
        if err != nil{
            panic(err)
        }

        io.WriteString(conn, fmt.Sprint("Hello World\n",time.Now(),"\n"))

        conn.Close()
    }
}

我们创建 TCP 服务,监听本地的 9000 端口,看一下 Listen 方法具体做了什么,我们查看一下 Listen 的源码,Listen 方法接收 net 和 laddr 两个参数,然后返回一个 Listener 和 error 对象。listen表示服务已经就绪可以接受请求,但是不等于已经连接上服务。这是请求连接的客户端的请求还处于请求等待中。

conn, err := ln.Accept()

表示接受客户端的请求,返回 socket 套接字连接,向客户端写入数据。

func Listen(net, laddr string) (Listener, error){
}
type Listener interface{
  Accept(){ c Conn, err error}
  Close()
  Addr()
}

继续查看返回的 Listener 接口提供了 Close、Accept 和 Addr 三个方法。在上面的代码中 defer ln.Close() 我们调用了其Close 方法表示最终将关闭服务。
在 for 循环中,在 go 语言中没有 while 和 do-while ,只有 for 在没有任何条件就是表示无限循环。在循环体中调用ln.Accept()方法来获取连接对象 connect

type Conn interface{
  Read(b []byte) (n int, err error)
 ...
}

你可能感兴趣的:(golang 网络编程(2)TCP)