Go socket程式設計

2022-01-10 06:51:04 字數 2938 閱讀 6717

socket應該是各種語言中網路程式設計的基礎,它介於應用層與傳輸層之間,只要學會使用它的介面即可。

以下建立兩台機器互相通訊。

以下是go語言中通過socketgoroutine編寫的乙個非常簡單的服務端。

流程如下:

建立與服務端的鏈結

進行資料收發

關閉鏈結

// d:\goleran\src\yunya.com\tcpserver>

package main

import (

"bufio"

"fmt"

"net"

"strings"

)func main()

for

go process(conn) // 啟動多個goroutine來處理回覆 }}

// 處理請求

func process(conn net.conn)

recvstr := string(buf[:n])

fmt.println("client message:", recvstr)

var inputmsg string

fmt.println("請輸入你要傳送的資訊:")

fmt.scanln(&inputmsg)

inputmsg = strings.trim(inputmsg, "\r\n") // 去除空行等,防止阻塞

conn.write(byte(inputmsg))

}}

以下是客戶端的**。

建立與服務端的鏈結

進行資料收發

關閉鏈結

d:\goleran\src\yunya.com\tcpclient>

package main

import (

"fmt"

"net"

"strings"

)func main()

defer conn.close() // 關閉雙向鏈結

for

_, err = conn.write(byte(inputmsg)) // 傳送資料

if err != nil

buf := [512]byte{}

servermsg, err := conn.read(buf[:]) // 服務端返回的資訊

if err != nil

fmt.println("server message:", string(buf[:servermsg]))

}}

udp不用建立雙向鏈結,訊息不可靠。因此一般來說使用較少。

// udp/server/main.go

// udp server端

func main() )

if err != nil

defer listen.close()

for

fmt.printf("data:%v addr:%v count:%v\n", string(data[:n]), addr, n)

_, err = listen.writetoudp(data[:n], addr) // 傳送資料

if err != nil

}}

客戶端**如下:

// udp 客戶端

func main() )

if err != nil

defer socket.close()

senddata := byte("hello server")

_, err = socket.write(senddata) // 傳送資料

if err != nil

data := make(byte, 4096)

n, remoteaddr, err := socket.readfromudp(data) // 接收資料

if err != nil

fmt.printf("recv:%v addr:%v count:%v\n", string(data[:n]), remoteaddr, n)

}

由於tcp是流式傳輸協議。所以可能會產生粘包現象,我們需要劃分每次資料的大小邊界,所以可以自定製乙個收發訊息的協議。如下:

// socket_stick/proto/proto.go

package proto

import (

"bufio"

"bytes"

"encoding/binary"

)// encode 將訊息編碼

func encode(message string) (byte, error)

// 寫入訊息實體

err = binary.write(pkg, binary.littleendian, byte(message))

if err != nil

return pkg.bytes(), nil

}// decode 解碼訊息

func decode(reader *bufio.reader) (string, error)

// buffered返回緩衝中現有的可讀取的位元組數。

if int32(reader.buffered()) < length+4

// 讀取真正的訊息資料

pack := make(byte, int(4+length))

_, err = reader.read(pack)

if err != nil

return string(pack[4:]), nil

}

程式設計,還是程式設計

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

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...