2019独角兽企业重金招聘Python工程师标准>>>

环境: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 mainimport ("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 mainimport ("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 frameupdate: function (dt) {},
});

转载于:https://my.oschina.net/mickelfeng/blog/1786930

Golang websocket相关推荐

  1. golang websocket 聊天室demo

    近期偶然的机会看到一些go的websocket技术方案,顺便写了个demo,玩了一下: 首先安装websocket包 go get code.google.com/p/go.net/websocket ...

  2. golang websocket conn.close关闭错误_Websockets 与在golang中的应用

    Network socket Network socket或socket是一台或多台服务器中不同应用程序之间相互通信的接口.socket可以用于不同的网络协议, 如HTTP, FTP等. 切不同的so ...

  3. golang+websocket实现

    话不多说直接上代码. golang代码: package mainimport ("fmt""net/http""os""refl ...

  4. golang websocket绑定用户_Golang(五)最佳Web框架对比

    Golang是一门快速增长的语言,专为构建简单.快速且可靠的软件而设计.它提供的net/http库对于HTTP协议实现非常好,基于此再构造框架会更容易,因此生态中出现了很多框架.本文将从流行度.社区支 ...

  5. golang websocket 模拟pc扫码登录

    github 地址 go-qrcode-login-mock 第一次写golang程序,用来学习的. 模拟PC浏览器二维码扫描登录的过程,手机APP端用 微信 模拟,简单起见,APP端只要发送toke ...

  6. golang websocket简单实现

    包 go get github.com/gorilla/websocket 相关方法 获取连接 func (u *Upgrader) Upgrade(w http.ResponseWriter,r * ...

  7. Golang websocket 客户端开发

    文章目录 client 示例01 client 示例02 client 示例03 client 示例01 package mainimport ("flag""log&q ...

  8. golang websocket wss 遇到 dial: x509 错误

    客户端调用代码 websocket.DefaultDialer.Dial(url, headers) 解决方法 修改客户端代码如下,跳过证书验证 websocket.Dialer{TLSClientC ...

  9. golang websocket 一个语音聊天室

    原版是这位仁兄的https://github.com/99MyCql/chatRoom.我添加了图片和语音功能.因为H5的录音功能是需要https的,所以又在源码中添加了https的支持并修改ngin ...

最新文章

  1. Docker 阿里云镜像加速
  2. modprobe:FATAL: could not load /lib/modules/2.6.35-22-generic/modules.dep No such file or directory
  3. Google的面试题长啥样
  4. 安装python缺少dll_python报错DLL load failed:找不到模块怎么解决?
  5. 知道圆心半径取圆上的经纬度_作为一名台球高手,你应该知道的事
  6. atitit.html编辑器的设计要点与框架选型 attilax总结
  7. 华三服务器bios中查看硬盘,H3C服务器升级BIOS
  8. BiometricPrompt之三 - Fingerprint, Iris, Face UI优先级
  9. python读取组合惯导数据,并进行坐标转换到北东天、utm坐标系
  10. Layabox 屏幕适配
  11. ssl证书申请,springboot部署https
  12. 在python中for a in a是什么意思_Python:A [1:]中x的含義是什么?
  13. oracle事务处理语言,Oracle DTL 数据事务语言
  14. 1062 最简分数 (20 分)
  15. 《Hud 2589》Phalanx详解
  16. 天创速盈带您速读:拼多多有必要开直通车吗?有哪些禁忌?
  17. MyBatis面试题及答案
  18. 淘宝评价显示及记分规则
  19. java洁癖_如何平衡代码洁癖和项目进度?
  20. 什么是大数据?什么是数据科学

热门文章

  1. mysql数据库三级分类_5.在 MySQL数据库中,以下数据库对象与数据库三级模式对应关系正确的是?...
  2. tf.GradientTape() 示例
  3. 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
  4. win10系统英雄联盟老是重新连接服务器,win10lol重新连接无法连接服务器重试该怎么才能解决...
  5. android 相机智能补光,美图秀秀智能补光功能应用详解
  6. android+5系统,Android2.3.5系统+华为UI
  7. 【Zookeeper】Zookeeper集群“脑裂”问题处理大全
  8. 烂大街的Spring循环依赖该如何回答?
  9. Nginx的location、root、alias指令用法和区别
  10. GOROOT、GOPATH