從零開始寫Go網路通訊框架(4) 全雙工收發訊息

2021-08-02 22:50:54 字數 2500 閱讀 2532

經過上面三篇文章,我們已經寫了乙個簡單的c/s框架,可以實現客戶端與服務端進行傳送訊息。但這是乙個單向通訊的。我們要想讓客戶端接收服務端發來的命令,並執行響應的動作,就需要寫成全雙工收發訊息。即客戶端也能接收服務端發來的指令。

下面我在客戶端定義乙個方法,用來接收服務端的訊息。

//接收服務端發來的訊息

func readmsg(conn net.conn)

客戶端完整**如下:

)//定義checkerror方法,避免寫太多到 if err!=nil

func checkerror(err error)

}func main()

//動態傳入服務端ip和埠號

service:=os.args[1]

tcpaddr,err:=net.resolvetcpaddr("tcp4",service)

checkerror(err)

conn,err:=net.dialtcp("tcp",nil,tcpaddr)

checkerror(err)

ch:=make(chan int,100)

ticker := time.newticker(time.second)

defer ticker.stop()

for }}

//客戶端訊息處理

func clientmsghandler(conn net.conn,ch chan int)

func getsession() string

//接收服務端發來的訊息

func readmsg(conn net.conn)

//向服務端傳送訊息

func sendmsg(conn net.conn,msg string) "

//將資訊封包

smsg:=protocol.enpack(byte(words))

conn.write(smsg)

}在服務端,我們也做了響應的調整。定義乙個方法,專門向客戶端傳送訊息。

//服務端向客戶端傳送訊息

func writemsgtoclient(conn net.conn)

服務端完整**如下:

)//定義checkerror方法,避免寫太多到 if err!=nil

func checkerror(err error)

}//自定義log

func log(v... inte***ce{})

func main() }

//服務端訊息處理

func servermsghandler(conn net.conn)

//解包

fmt.println("client say:",string(tmpbuf))

msg:=tmpbuf

//向客戶端傳送訊息

go writemsgtoclient(conn)

beatch :=make(chan byte)

//心跳計時,預設30秒

go heartbeat(conn,beatch,30)

//檢測每次client是否有資料傳來

go heartchanhandler(msg,beatch) }}

//處理心跳,根據heartchanhandler判斷client是否在設定時間內發來資訊

func heartbeat(conn net.conn,heartchan chan byte,timeout int)

}//服務端向客戶端傳送訊息

func writemsgtoclient(conn net.conn)

//處理心跳channel

func heartchanhandler( n byte,beatch chan byte)

close(beatch)

}//從channell中讀取資料

func readchan(readchan chan byte)

}}現在配上一張圖,server端不斷給client端傳送訊息"wordpress",client不斷向server端匯報當前時間。

開始了解網路通訊

其實瀏覽器和應用程式都是客戶端,他們可以傳送syn包建立tcp連線。tcp連線的第乙個包,非常小的一種資料報。syn攻擊包括大量此類的包,由於這些包看上去來自實際不存在的站點,因此無法 有效進行處理。當兩台計算機在tcp連線上進行會話時,連線一定會首先被初始化。完成這項任務的包叫作syn。乙個syn...

從零開始了解Go語言開發

hello world 現在我們來建立第乙個go專案 hello。在我們桌面建立乙個hello目錄。package main 宣告 main 包,表明當前是乙個可執行程式 import fmt 匯入內建 fmt 包 func main 預設我們go build的可執行檔案都是當前作業系統可執行的檔案...

如何從零開始寫shell指令碼

如何從零開始寫shell指令碼 一 前言 為什麼我們需要使用shell 指令碼?難道我們之前學習的c c 不能夠完成shell指令碼語言的功能嗎,為什麼我們還需要學習shell指令碼?學習shell指令碼最大的好處是能夠輕易處理檔案與目錄之類的物件,如果同樣此類任務,利用c 或者c,則編寫程式很麻煩...