socket
應該是各種語言中網路程式設計的基礎,它介於應用層與傳輸層之間,只要學會使用它的介面即可。
以下建立兩台機器互相通訊。
以下是go
語言中通過socket
和goroutine
編寫的乙個非常簡單的服務端。
流程如下:
建立與服務端的鏈結進行資料收發
關閉鏈結
// 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,給套接字起個名字,用系統呼叫...