golang socket程式設計

2022-02-23 23:01:29 字數 4038 閱讀 9542

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.readallconn中讀取全部的文字,也就是服務端響應反饋的資訊。

上面我們編寫了乙個tcp的客戶端程式,也可以通過net包來建立乙個伺服器端程式,在伺服器端我們需要繫結服務到指定的非啟用埠,並監聽此埠,當有客戶端請求到達的時候可以接收到來自客戶端連線的請求。net包中有相應功能的函式,函式定義如下:

func listentcp(network string, laddr *tcpaddr) (*tcplistener, error)

func (l *tcplistener) accept() (conn, error)

package main

import (

"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) error

func (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 main

import (

"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 main

import (

"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...

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...