下载websocket包

$ go get golang.org/x/net/websocket

如果下载失败,可能是被墙了。

package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket" (https fetch: Get https://golang.org/x/net/websocket?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)

可以尝试

$ go get -u github.com/golang/net/websocket

下载后记得将路径改成golang.org/x/net/websocket

$ cd $GOPATH
$ mkdir -p golang.org/x/net
$ cp github.com/golang/net/websocket/ golang.org/x/net/ -R

实例

服务端代码

server.go

package main

import (  

    "fmt"   

    "golang.org/x/net/websocket" 

    "html/template"              //支持模板html  

    "log"  

    "net/http"  

)

func Echo(ws *websocket.Conn) {  

    var err error  

    for {  

        var reply string  

        //websocket接受信息  

        if err = websocket.Message.Receive(ws, &reply); err != nil {  

            fmt.Println("receive failed:", err)  

            break  

        }

        fmt.Println("reveived from client: " + reply)

        msg := "received:" + reply

        fmt.Println("send to client:" + msg)

        //这里是发送消息

        if err = websocket.Message.Send(ws, msg); err != nil {

            fmt.Println("send failed:", err)

            break

        }

    }

}

func web(w http.ResponseWriter, r *http.Request) {  

    //打印请求的方法  

    fmt.Println("method", r.Method)  

    if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端  

        t, _ := template.ParseFiles("websocket.html")  

        t.Execute(w, nil)  

    } else {  

        //否则走打印输出post接受的参数username和password  

        fmt.Println(r.PostFormValue("username"))  

        fmt.Println(r.PostFormValue("password"))  

    }  

}

func main() {

    //接受websocket的路由地址

    http.Handle("/websocket", websocket.Handler(Echo))

    //html页面

    http.HandleFunc("/web", web)

    if err := http.ListenAndServe(":1234", nil); err != nil {

        log.Fatal("ListenAndServe:", err)

    }

}

客户端代码

websocket.html

<!DOCTYPE html>

 <html>

<head>

    <meta charset="utf-8"/>

    <title>go测试socket</title>

</head>

<body>

    <script type="text/javascript">

        var sock = null;

        var wsuri = "ws://127.0.0.1:1234/websocket";

        window.onload = function() {

            console.log("onload");

            sock = new WebSocket(wsuri);

            sock.onopen = function() {

                console.log("connected to " + wsuri);

            }

            sock.onclose = function(e) {

                console.log("connection closed (" + e.code + ")");

            }

            sock.onmessage = function(e) {

                console.log("message received: " + e.data);

            }

        };

        function send() {

            var msg = document.getElementById('message').value;

            sock.send(msg);

        };

    </script>

    <h1>WebSocket Echo Test</h1>

    <form>

        <p>

            Message: <input id="message" type="text" value="Hello, world!">

        </p>

    </form>

    <button onclick="send();">Send Message</button>

</body>

</html>

测试

启动服务端

$ ./server

启动浏览器

输入http://127.0.0.1:1234/web

网络通信内容如图所示,首先加载页面,接着使用HTTP建立websocket连接,后续通信直接使用websocket进行。

点击 页面中SendMessage按钮

server端输出:

method GET

reveived from client: Hello, world!

send to client:received:Hello, world!

浏览器输出:

参考

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.2.md

https://github.com/ukai/go-websocket-sample/blob/master/websocket_echo_sample.go

Golang如何使用websocket的更多相关文章

  1. golang vue 使用 websocket 的例子

    一. 编写golang服务端 1.导入必要的websocket包,golang.org/x/net/websocket 或 github.com/golang/net/websocket 2.编写消息 ...

  2. golang gorilla websocket例子

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

  3. HTML5 直播协议之 WebSocket 和 MSE

    当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 WebRTC. 今天我要向 ...

  4. WebSocket+MSE——HTML5 直播技术解析

    作者 | 刘博(又拍云多媒体开发工程师) 当前为了满足比较火热的移动 Web 端直播需求,一系列的 HTML5 直播技术迅速的发展起来. 常见的可用于 HTML5 的直播技术有 HLS.WebSock ...

  5. [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!

    ​概述 本文提供Redis持久化技术说明,  建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...

  6. golang之websocket 源码分析

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

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

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

  8. WebSocket 和 Golang 实现聊天功能

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

  9. Golang websocket推送

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

随机推荐

  1. localStorage的使用记录

    // 存数据 var str = JSON.stringify(back); localStorage.setItem("options", str); // 取数据 var op ...

  2. kbmMW SmartService控制返回类型

  3. FGX Native library功能介绍

    Hot news from the fields of the cross-platform library "FGX Native" development. New Engli ...

  4. crontab入门及进阶学习笔记

    crontab不是通常意义下的linux指令,它更是一个配置工具.通过这个工具,我们可以为系统定制固定周期的任务. 1.crond和crontab 1)   crond:cron服务的守护进程,用于定 ...

  5. 路径问题 :<c:url >的作用

    最近的项目一直报这样的错 可是本地启动 又没问题,xshell查看日志 没有错误日志,找了好久都没想到错误原因.一位大佬几分钟就找到原因了有点扎心. 首先说一下解决问题的思路.首先报错是4开头,说明是 ...

  6. Server SSL certificate verification failed: certificate has expired, issuer is not trusted

    Unable to connect to a repository at URL 'https://xxxxx/svn/include' Server SSL certificate verifica ...

  7. SpringMVC详细示例实战教程(较全开发教程)

    SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...

  8. pdb的数量限制

    Decide How to Configure the CDB --搜索文档 Prepare to create the CDB by research and careful planning. T ...

  9. Oracle 10g安装报错记录

    环境描述linux 5.6 安装Oracle 10.2.0.1.0 DBCA问题 1)DBCA图形化界面,出现乱码 测试环境,操作系统中文字符编码导致 export LANG=C 2)DBCA图形化点 ...

  10. Python之路,第十二篇:Python入门与基础12

    python3 函数3 装饰器 decorator   *** 概念:装饰器是一个函数,主要作用是用来包装另一个函数或类: 包装的目的:是在不改变原函数名的情况下,改变被包装函数(对象)的行为. 装饰 ...