go語言中通過net包中的dialtcp
函式來建立乙個tcp連線,並返回乙個tcpconn
型別的物件,當連線建立時伺服器端也建立乙個同型別的物件,此時客戶端和伺服器端通過各自擁有的tcpconn
物件來進行資料交換。一般而言,客戶端通過tcpconn
物件將請求資訊傳送到伺服器端,讀取伺服器端響應的資訊。伺服器端讀取並解析來自客戶端的請求,並返回應答資訊,這個連線只有當任一端關閉了連線之後才失效,不然這連線可以一直在使用。建立連線的函式定義如下:
func dialtcp(network string, laddr, raddr *tcpaddr) (*tcpconn, error)
客戶端**:
通過上面的**我們可以看出:首先程式將使用者的輸入作為引數service
傳入net.resolvetcpaddr
獲取乙個tcpaddr,然後把tcpaddr傳入dialtcp後建立了乙個tcp連線conn
,通過conn
來傳送請求資訊,最後通過ioutil.readall
從conn
中讀取全部的文字,也就是服務端響應反饋的資訊。
上面我們編寫了乙個tcp的客戶端程式,也可以通過net包來建立乙個伺服器端程式,在伺服器端我們需要繫結服務到指定的非啟用埠,並監聽此埠,當有客戶端請求到達的時候可以接收到來自客戶端連線的請求。net包中有相應功能的函式,函式定義如下:
func listentcp(network string, laddr *tcpaddr) (*tcplistener, error)func (l *tcplistener) accept() (conn, error)
package mainimport (
"fmt""
net""os
""time")
func main()
go handleclient(conn)
}}func handleclient(conn net.conn)
func checkerror(err error)
}
tcp有很多連線控制函式,我們平常用到比較多的有如下幾個函式:
func dialtimeout(net, addr string, timeout time.duration) (conn, error)
設定建立連線的超時時間,客戶端和伺服器端都適用,當超過設定時間時,連線自動關閉。
func (c *tcpconn) setreaddeadline(t time.time) errorfunc (c *tcpconn) setwritedeadline(t time.time) error
用來設定寫入/讀取乙個連線的超時時間。當超過設定時間時,連線自動關閉。
func (c *tcpconn) setkeepalive(keepalive bool) os.error
設定keepalive屬性。作業系統層在tcp上沒有資料和ack的時候,會間隔性的傳送keepalive包,作業系統可以通過該包來判斷乙個tcp連線是否已經斷開,在windows上預設2個小時沒有收到資料和keepalive包的時候認為tcp連線已經斷開,這個功能和我們通常在應用層加的心跳包的功能類似。
go語言包中處理udp socket和tcp socket不同的地方就是在伺服器端處理多個客戶端請求資料報的方式不同,udp缺少了對客戶端連線請求的accept函式。其他基本幾乎一模一樣,只有tcp換成了udp而已。udp的幾個主要函式如下所示:
func resolveudpaddr(net, addr string) (*udpaddr, os.error)func dialudp(net string, laddr, raddr *udpaddr) (c *udpconn, err os.error)
func listenudp(net string, laddr *udpaddr) (c *udpconn, err os.error)
func (c *udpconn) readfromudp(b byte) (n int, addr *udpaddr, err os.error)
func (c *udpconn) writetoudp(b byte, addr *udpaddr) (n int, err os.error)
udp客戶端
乙個udp的客戶端**如下所示,我們可以看到不同的就是tcp換成了udp而已:
package mainimport (
"fmt""
net""os
")func main()
service := os.args[1
] udpaddr, err := net.resolveudpaddr("
udp4
", service)
checkerror(err)
conn, err := net.dialudp("
udp"
, nil, udpaddr)
checkerror(err)
_, err = conn.write(byte("
anything"))
checkerror(err)
var buf [512]byte
n, err := conn.read(buf[0
:]) checkerror(err)
fmt.println(
string(buf[0
:n]))
os.exit(0)
}func checkerror(err error)
udp服務端:
package mainimport (
"fmt""
net""os
""time")
func main()
}func handleclient(conn *net.udpconn)
daytime :=time.now().string()
conn.writetoudp(
byte
(daytime), addr)
}func checkerror(err error)
}
通過對tcp和udp socket程式設計的描述和實現,可見go已經完備地支援了socket程式設計,而且使用起來相當的方便,go提供了很多函式,通過這些函式可以很容易就編寫出高效能的socket應用。
Golang Socket程式設計小例項
1.服務端監聽並處理接收資訊 package main import fmt io net func process conn net.conn if err nil 最終獲取到的資料,取數時要注意,是0 n 個不是2048,因為最終讀取到的是n readstr string readbyte n ...
golang socket 斷點續傳
客戶端傳送訊息詢問服務端,你上次接收到的檔案內容位置 服務端告訴客戶端上次接收到的檔案內容位置 客戶端就從上次斷點的位置繼續傳送檔案內容 客戶端傳送檔案內容完畢後通知服務端,然後斷開連線 下面我們看看 的實現 服務端 file name server.go package main import o...
程式設計,還是程式設計
喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...