所有的新技術都經曆了一些成長的痛苦,區塊鏈技術也一樣。但是,儘管它還處於發展的早期階段,但它具有改進許多行業、許多應用和系統的巨大潛力。
Go語言具有其關鍵特性。Go語言之所以如此強大,是因為它在服務端的開發中總能抓住程式員的痛癢需求,用最直接、簡單、高效、穩定的方式來解決並實現問題。
今天來一個簡單的內容,用golang寫一個簡單的echo server。
TCP/IP協議
大家都知道TCP/IP協議簇是當今網路世界的事實標準協議,與其對應的是OSI的七層模型,對於這七層模型這裡就不再贅述了,這裡只是簡單介紹一下TCP/IP的四層模型。
TCP/IP的四層模型最下面是一個物理層,上面是網路層,再往上就是傳輸層,最後是應用程式層了,分層的概念相信大家都之的,這樣在不同層之間變化就是打包或者解包,簡單來說就是加上頭資訊或者去迴轉資訊。
golang API
golang的net包裡面有很方便的API供我們使用,這個API主要可以劃分成Addr,Listen,Connection,Dialer,IP和其他的一些網路API,例如DNS API等,這裡就不介紹其他的網路API(主要是自己也沒有研究_)。
Addr主要有IPAddr,TCPAddr,UDPAddr和UnixAddr,主要就是不同的地址,這是網路編程的基礎,沒有地址就像寫信不附地址,根本寄不到啊!
Listener主要就是TCPListener,UnixListener(咦,為什麼沒有UDPListener呢?),Listener是一般是服務端需要調用的,因為服務端需要監-聽用戶端呀,時刻看著Y的來不來跟我打招呼啊。
Connection就是串連嗎,它就是兩個節點溝通的橋樑啊,沒有它你就跟你對象搭不上話啊。
Dialer就是要求者啊,當服務端準備好了之後,用戶端就可以Dial一下了,如果順利的話就可以拿到一個Connection,這樣的話就可以跟另一端的人搭上話了。
簡單的Echo Server
好了,現在用一個Echo Server來簡單的展示一下如何使用TCP來進行網路通訊,當然你也可以用UDP。
Server
package main
import (
"net"
"os"
"fmt"
"io"
)
const BUFF_SIZE = 1024
var buff = make([]byte,BUFF_SIZE)
// 接受一個TCPConn處理內容
func handleConn(tcpConn *net.TCPConn){
if tcpConn == nil {
return
}
for {
n,err := tcpConn.Read(buff)
if err == io.EOF {
fmt.Printf("The RemoteAddr:%s is closed!\n",tcpConn.RemoteAddr().String())
return
}
handleError(err)
if string(buff[:n]) == "exit" {
fmt.Printf("The client:%s has exited\n",tcpConn.RemoteAddr().String())
}
if n > 0 {
fmt.Printf("Read:%s",string(buff[:n]))
}
}
}
// 錯誤處理
func handleError(err error) {
if err == nil {
return
}
fmt.Printf("error:%s\n",err.Error())
}
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ")
return
}
port := os.Args[1]
tcpAddr,err := net.ResolveTCPAddr("tcp4","localhost:"+port)
handleError(err)
tcpListener,err := net.ListenTCP("tcp4",tcpAddr) //監聽
handleError(err)
defer tcpListener.Close()
for {
tcpConn,err := tcpListener.AcceptTCP()
fmt.Printf("The client:%s has connected!\n",tcpConn.RemoteAddr().String())
handleError(err)
defer tcpConn.Close()
go handleConn(tcpConn) //起一個goroutine處理
}
}
Client
package main
import (
"net"
"fmt"
"os"
"bufio"
)
const BUFF_SIZE = 1024
var input = make([]byte,BUFF_SIZE)
func handleError(err error) {
if err == nil {
return
}
fmt.Printf("error:%s\n",err.Error())
}
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: ")
return
}
port := os.Args[1]
tcpAddr,err := net.ResolveTCPAddr("tcp4","localhost:"+port)
handleError(err)
tcpConn,err := net.DialTCP("tcp4",nil,tcpAddr)
handleError(err)
reader := bufio.NewReader(os.Stdin)
var continued = true
var inputStr string
for continued {
n,err := reader.Read(input)
handleError(err)
if n > 0 {
k,_ := tcpConn.Write(input[:n])
if k > 0 {
inputStr = string(input[:k])
fmt.Printf("Write:%s",inputStr)
if inputStr == "exit\n" { //在比對時由於有個斷行符號符,所以加上\n
continued = false //也可以將inputStr = TrimRight(inputStr,"\n")
}
}
}
}
}
高能預警,兄弟連教育區塊鏈直播課程8月持續火爆來襲!
原價1188元的12節區塊鏈進階課程,現僅需1元!
還可免費領取《Go語言基礎實戰項目開發》與《Go語言進階實戰項目開發》教材兩本!!
限時限量!!先到先得!!
http://www.ydma.cn/open/course/24
關注兄弟連區塊鏈技術公眾號領取更多技術乾貨哦!!!