环境: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代码

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "golang.org/x/net/websocket"
  6. "net/http"
  7. "os"
  8. "time"
  9. )
  10.  
  11. //错误处理函数
  12. func checkErr(err error, extra string) bool {
  13. if err != nil {
  14. formatStr := " Err : %s\n";
  15. if extra != "" {
  16. formatStr = extra + formatStr;
  17. }
  18.  
  19. fmt.Fprintf(os.Stderr, formatStr, err.Error());
  20. return true;
  21. }
  22.  
  23. return false;
  24. }
  25.  
  26. func svrConnHandler(conn *websocket.Conn) {
  27. request := make([]byte, );
  28. defer conn.Close();
  29. for {
  30. readLen, err := conn.Read(request)
  31. if checkErr(err, "Read") {
  32. break;
  33. }
  34.  
  35. //socket被关闭了
  36. if readLen == {
  37. fmt.Println("Client connection close!");
  38. break;
  39. } else {
  40. //输出接收到的信息
  41. fmt.Println(string(request[:readLen]))
  42.  
  43. time.Sleep(time.Second);
  44. //发送
  45. conn.Write([]byte("World !"));
  46. }
  47.  
  48. request = make([]byte, );
  49. }
  50. }
  51.  
  52. func main() {
  53. http.Handle("/echo", websocket.Handler(svrConnHandler));
  54. err := http.ListenAndServe(":6666", nil);
  55. checkErr(err, "ListenAndServe");
  56. fmt.Println("Func finish.");
  57. }

PS:《Golang socket》中使用了go coroutine来处理connection的消息阻塞接收,websocket不需要进行这样的处理,否则将报use of closed network connection的错误!

3.

①客户端Go代码

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "golang.org/x/net/websocket"
  6. "os"
  7. "sync"
  8. )
  9.  
  10. var gLocker sync.Mutex; //全局锁
  11. var gCondition *sync.Cond; //全局条件变量
  12.  
  13. var origin = "http://127.0.0.1:6666/"
  14. var url = "ws://127.0.0.1:6666/echo"
  15.  
  16. //错误处理函数
  17. func checkErr(err error, extra string) bool {
  18. if err != nil {
  19. formatStr := " Err : %s\n";
  20. if extra != "" {
  21. formatStr = extra + formatStr;
  22. }
  23.  
  24. fmt.Fprintf(os.Stderr, formatStr, err.Error());
  25. return true;
  26. }
  27.  
  28. return false;
  29. }
  30.  
  31. //连接处理函数
  32. func clientConnHandler(conn *websocket.Conn) {
  33. gLocker.Lock();
  34. defer gLocker.Unlock();
  35. defer conn.Close();
  36. request := make([]byte, );
  37. for {
  38. readLen, err := conn.Read(request)
  39. if checkErr(err, "Read") {
  40. gCondition.Signal();
  41. break;
  42. }
  43.  
  44. //socket被关闭了
  45. if readLen == {
  46. fmt.Println("Server connection close!");
  47.  
  48. //条件变量同步通知
  49. gCondition.Signal();
  50. break;
  51. } else {
  52. //输出接收到的信息
  53. fmt.Println(string(request[:readLen]))
  54.  
  55. //发送
  56. conn.Write([]byte("Hello !"));
  57. }
  58.  
  59. request = make([]byte, );
  60. }
  61. }
  62.  
  63. func main() {
  64. conn, err := websocket.Dial(url, "", origin);
  65. if checkErr(err, "Dial") {
  66. return;
  67. }
  68.  
  69. gLocker.Lock();
  70. gCondition = sync.NewCond(&gLocker);
  71. _, err = conn.Write([]byte("Hello !"));
  72. go clientConnHandler(conn);
  73.  
  74. //主线程阻塞,等待Singal结束
  75. for {
  76. //条件变量同步等待
  77. gCondition.Wait();
  78. break;
  79. }
  80. gLocker.Unlock();
  81. fmt.Println("Client finish.")
  82. }

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

  1. cc.Class({
  2. extends: cc.Component,
  3.  
  4. properties: {
  5.  
  6. },
  7.  
  8. ctor: function () {
  9. this.ws = null;
  10. },
  11.  
  12. onLoad: function () {
  13. var self = this;
  14.  
  15. this.ws = new WebSocket("ws://127.0.0.1:6666/echo");
  16. this.ws.onopen = function (event) {
  17.  
  18. console.log("Send Text WS was opened.");
  19.  
  20. if (self.ws.readyState === WebSocket.OPEN) {
  21. self.ws.send("Hello !");
  22. }
  23. else{
  24. console.log("WebSocket instance wasn't ready...");
  25. }
  26. };
  27.  
  28. this.ws.onmessage = function (event) {
  29. console.log("response text msg: " + event.data);
  30. self.ws.send("Hello !");
  31. };
  32.  
  33. this.ws.onerror = function (event) {
  34. console.log("Send Text fired an error");
  35. };
  36.  
  37. this.ws.onclose = function (event) {
  38. console.log("WebSocket instance closed.");
  39. };
  40.  
  41. },
  42.  
  43. // called every frame
  44. update: function (dt) {
  45.  
  46. },
  47. });

以上。

Golang websocket的更多相关文章

  1. Golang websocket推送

    Golang websocket推送 在工作用主要使用的是Java,也做过IM(后端用的netty websocket).最近想通过Golang重写下,于是通过websocket撸了一个聊天室. 项目 ...

  2. GIN+GORILLA=A GOLANG WEBSOCKET SERVER

    鉴于聊天已然成为大部分app的基础功能,而大部分app用户基数有没有辣么大,常用的聊天server架构如xmpp或者消息队列实现之类的用起来还挺麻烦的,有比较难跟网页端做交互,加之H5标准落地,所以w ...

  3. golang Gin framework with websocket

    概述 golang websocket 库 示例 后端 前端 结论 概述 对于 golang 的 web 开发, 之前写过 2 篇 blog, 分别介绍了: 在 Gin 框架下, 各类 http AP ...

  4. golang 聊天室

    近期看了一些关于golang的资料.发现它的WEBSOCKT实现真起来真的非常easy.以下是代码 go.net/websocket是须要安装的,这个自己装上即可 package main impor ...

  5. golang之websocket 源码分析

    下载go的websocket包. 1. 通过google官方的方法, 需要hg来同步代码. 由于墙的原因, 还需要设置代理. 比较麻烦 2. http://gopm.io/ 通过该网站下载, 这是go ...

  6. golang(5):编写WebSocket服务,client和html5调用

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1.关于websocket HTML5定义了 ...

  7. WebSocket 和 Golang 实现聊天功能

    http://www.open-open.com/lib/view/open1416379948711.html 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery  ...

  8. golang gorilla websocket例子

    WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...

  9. Golang如何使用websocket

    下载websocket包 $ go get golang.org/x/net/websocket 如果下载失败,可能是被墙了. package golang.org/x/net/websocket: ...

随机推荐

  1. ztree实现表格风格的树状结构

    zTree官方api: http://www.treejs.cn/v3/api.php 原理很简单:利用zTree的addDiyDom方法,自定义每个DOM节点,在原来的节点后面加一些div,再利用c ...

  2. elasticsearch配置文件详解

    来自:http://www.searchtech.pro/articles/2013/02/18/1361194291548.html elasticsearch的config文件夹里面有两个配置文 ...

  3. jsonp获取股票信息

    源码: <script src="http://hq.sinajs.cn/list=sh600050" charset="gb2312"></ ...

  4. jQuery知识总结(转)

    原文:http://fwhyy.com/2013/04/jquery-knowledge-summary/ 这篇文章在于筛选器的简单例子,让人一看就懂代码的作用 20170223 前言 jQuery一 ...

  5. [WCF REST] 一个简单的REST服务实例

    Get:http://www.cnblogs.com/artech/archive/2012/02/04/wcf-rest-sample.html [01] 一个简单的REST服务实例 [02] We ...

  6. thinkphp5 中使用 七牛云 上传图片和文件

    原文链接:http://www.thinkphp.cn/code/3279.html 参考:https://blog.csdn.net/rain_web/article/details/7910542 ...

  7. C语言动态链表数据结构实现的学生信息项目

    注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...

  8. 【python--函数解读】

    1.strip()函数:用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列(包括'\n', '\r',  '\t',  ' ') 注意: 该方法只能删除开头或是结尾的字符,不能删除中间部分的 ...

  9. ssh-copy-id命令解析

    ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上, ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/ ...

  10. ant安装