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)
...
}