Golang websocket


環境:Win10 + Go1.9.2

1.先下載並引用golang的websocket庫

①golang的官方庫都在https://github.com/golang下,而websocket庫在/net下。

②如果沒有安裝Git,需要先安裝Git。

③使用go get -u github.com/golang/net/websocket下載代碼,將安裝在環境變量GOPATH配置的路徑中。

代碼中使用路徑為 "golang.org/x/net/websocket",在對應路徑下沒有代碼的話則引用出錯,可將對應代碼放在GOPAHT/golang.org/x/net下。

 

2.服務端Go代碼

package main import ( "fmt"
    "golang.org/x/net/websocket"
    "net/http"
    "os"
    "time" ) //錯誤處理函數
func checkErr(err error, extra string) bool { if err != nil { formatStr := " Err : %s\n"; if extra != "" { formatStr = extra + formatStr; } fmt.Fprintf(os.Stderr, formatStr, err.Error()); return true; } return false; } func svrConnHandler(conn *websocket.Conn) { request := make([]byte, 128); defer conn.Close(); for { readLen, err := conn.Read(request) if checkErr(err, "Read") { break; } //socket被關閉了
        if readLen == 0 { fmt.Println("Client connection close!"); break; } else { //輸出接收到的信息
            fmt.Println(string(request[:readLen])) time.Sleep(time.Second); //發送
            conn.Write([]byte("World !")); } request = make([]byte, 128); } } func main() { http.Handle("/echo", websocket.Handler(svrConnHandler)); err := http.ListenAndServe(":6666", nil); checkErr(err, "ListenAndServe"); fmt.Println("Func finish."); }

 PS:《Golang socket》中使用了go coroutine來處理connection的消息阻塞接收,websocket不需要進行這樣的處理,否則將報use of closed network connection的錯誤!

 

 3.

①客戶端Go代碼

package main import ( "fmt"
    "golang.org/x/net/websocket"
    "os"
    "sync" ) var gLocker sync.Mutex;    //全局鎖
var gCondition *sync.Cond; //全局條件變量

var origin = "http://127.0.0.1:6666/"
var url = "ws://127.0.0.1:6666/echo"

//錯誤處理函數
func checkErr(err error, extra string) bool { if err != nil { formatStr := " Err : %s\n"; if extra != "" { formatStr = extra + formatStr; } fmt.Fprintf(os.Stderr, formatStr, err.Error()); return true; } return false; } //連接處理函數
func clientConnHandler(conn *websocket.Conn) { gLocker.Lock(); defer gLocker.Unlock(); defer conn.Close(); request := make([]byte, 128); for { readLen, err := conn.Read(request) if checkErr(err, "Read") { gCondition.Signal(); break; } //socket被關閉了
        if readLen == 0 { fmt.Println("Server connection close!"); //條件變量同步通知
 gCondition.Signal(); break; } else { //輸出接收到的信息
            fmt.Println(string(request[:readLen])) //發送
            conn.Write([]byte("Hello !")); } request = make([]byte, 128); } } func main() { conn, err := websocket.Dial(url, "", origin); if checkErr(err, "Dial") { return; } gLocker.Lock(); gCondition = sync.NewCond(&gLocker); _, err = conn.Write([]byte("Hello !")); go clientConnHandler(conn); //主線程阻塞,等待Singal結束
    for { //條件變量同步等待
 gCondition.Wait(); break; } gLocker.Unlock(); fmt.Println("Client finish.") }

 

②如果客戶端不使用Go代碼,可以使用Cocos Creator的js代碼

cc.Class({ extends: cc.Component, properties: { }, ctor: function () { this.ws = null; }, onLoad: function () { var self = this; this.ws = new WebSocket("ws://127.0.0.1:6666/echo"); this.ws.onopen = function (event) { console.log("Send Text WS was opened."); if (self.ws.readyState === WebSocket.OPEN) { self.ws.send("Hello !"); } else{ console.log("WebSocket instance wasn't ready..."); } }; this.ws.onmessage = function (event) { console.log("response text msg: " + event.data); self.ws.send("Hello !"); }; this.ws.onerror = function (event) { console.log("Send Text fired an error"); }; this.ws.onclose = function (event) { console.log("WebSocket instance closed."); }; }, // called every frame
    update: function (dt) { }, });

 

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM