Golang websocket
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相关推荐
- golang websocket 聊天室demo
近期偶然的机会看到一些go的websocket技术方案,顺便写了个demo,玩了一下: 首先安装websocket包 go get code.google.com/p/go.net/websocket ...
- golang websocket conn.close关闭错误_Websockets 与在golang中的应用
Network socket Network socket或socket是一台或多台服务器中不同应用程序之间相互通信的接口.socket可以用于不同的网络协议, 如HTTP, FTP等. 切不同的so ...
- golang+websocket实现
话不多说直接上代码. golang代码: package mainimport ("fmt""net/http""os""refl ...
- golang websocket绑定用户_Golang(五)最佳Web框架对比
Golang是一门快速增长的语言,专为构建简单.快速且可靠的软件而设计.它提供的net/http库对于HTTP协议实现非常好,基于此再构造框架会更容易,因此生态中出现了很多框架.本文将从流行度.社区支 ...
- golang websocket 模拟pc扫码登录
github 地址 go-qrcode-login-mock 第一次写golang程序,用来学习的. 模拟PC浏览器二维码扫描登录的过程,手机APP端用 微信 模拟,简单起见,APP端只要发送toke ...
- golang websocket简单实现
包 go get github.com/gorilla/websocket 相关方法 获取连接 func (u *Upgrader) Upgrade(w http.ResponseWriter,r * ...
- Golang websocket 客户端开发
文章目录 client 示例01 client 示例02 client 示例03 client 示例01 package mainimport ("flag""log&q ...
- golang websocket wss 遇到 dial: x509 错误
客户端调用代码 websocket.DefaultDialer.Dial(url, headers) 解决方法 修改客户端代码如下,跳过证书验证 websocket.Dialer{TLSClientC ...
- golang websocket 一个语音聊天室
原版是这位仁兄的https://github.com/99MyCql/chatRoom.我添加了图片和语音功能.因为H5的录音功能是需要https的,所以又在源码中添加了https的支持并修改ngin ...
最新文章
- Docker 阿里云镜像加速
- modprobe:FATAL: could not load /lib/modules/2.6.35-22-generic/modules.dep No such file or directory
- Google的面试题长啥样
- 安装python缺少dll_python报错DLL load failed:找不到模块怎么解决?
- 知道圆心半径取圆上的经纬度_作为一名台球高手,你应该知道的事
- atitit.html编辑器的设计要点与框架选型 attilax总结
- 华三服务器bios中查看硬盘,H3C服务器升级BIOS
- BiometricPrompt之三 - Fingerprint, Iris, Face UI优先级
- python读取组合惯导数据,并进行坐标转换到北东天、utm坐标系
- Layabox 屏幕适配
- ssl证书申请,springboot部署https
- 在python中for a in a是什么意思_Python:A [1:]中x的含義是什么?
- oracle事务处理语言,Oracle DTL 数据事务语言
- 1062 最简分数 (20 分)
- 《Hud 2589》Phalanx详解
- 天创速盈带您速读:拼多多有必要开直通车吗?有哪些禁忌?
- MyBatis面试题及答案
- 淘宝评价显示及记分规则
- java洁癖_如何平衡代码洁癖和项目进度?
- 什么是大数据?什么是数据科学
热门文章
- mysql数据库三级分类_5.在 MySQL数据库中,以下数据库对象与数据库三级模式对应关系正确的是?...
- tf.GradientTape() 示例
- 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
- win10系统英雄联盟老是重新连接服务器,win10lol重新连接无法连接服务器重试该怎么才能解决...
- android 相机智能补光,美图秀秀智能补光功能应用详解
- android+5系统,Android2.3.5系统+华为UI
- 【Zookeeper】Zookeeper集群“脑裂”问题处理大全
- 烂大街的Spring循环依赖该如何回答?
- Nginx的location、root、alias指令用法和区别
- GOROOT、GOPATH