TCP(Transmission Control Protocol傳輸控制協(xié)議)是一種面向連接的奖唯、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。
說到網(wǎng)絡編程我們先理解一個術語套接字槽卫,突破這個術語,我們就向理解 TCP 邁出了一大步胰蝠。簡單比喻一下吧歼培,我們彼此間通過打電話或寫信的進行哪種不是面對面的交流,套接字就是我們進行這些交流工具茸塞,電話機或是郵箱丐怯,僅此而已。
我們今天用 go 語言實現(xiàn)一個 TCP 通訊翔横,go 語言對 TCP 進行封裝來方便我們開發(fā) 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()
}
}
我們創(chuàng)建 TCP 服務梗搅,監(jiān)聽本地的 9000 端口禾唁,看一下 Listen 方法具體做了什么,我們查看一下 Listen 的源碼无切,Listen
方法接收 net 和 laddr 兩個參數(shù)荡短,然后返回一個 Listener 和 error 對象。listen
表示服務已經(jīng)就緒可以接受請求哆键,但是不等于已經(jīng)連接上服務掘托。這是請求連接的客戶端的請求還處于請求等待中。
conn, err := ln.Accept()
表示接受客戶端的請求籍嘹,返回 socket 套接字連接闪盔,向客戶端寫入數(shù)據(jù)。
func Listen(net, laddr string) (Listener, error){
}
type Listener interface{
Accept(){ c Conn, err error}
Close()
Addr()
}
繼續(xù)查看返回的 Listener 接口提供了 Close辱士、Accept 和 Addr 三個方法泪掀。在上面的代碼中 defer ln.Close()
我們調(diào)用了其Close 方法表示最終將關閉服務。
在 for 循環(huán)中颂碘,在 go 語言中沒有 while 和 do-while 异赫,只有 for 在沒有任何條件就是表示無限循環(huán)。在循環(huán)體中調(diào)用ln.Accept()
方法來獲取連接對象 connect
type Conn interface{
Read(b []byte) (n int, err error)
...
}