Golang如何使用websocket

##下载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

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

实例

###服务端代码 server.go

1package main 2 3import ( 4 5 "fmt" 6 7 "golang.org/x/net/websocket" 8 9 "html/template" //支持模板html 10 11 "log" 12 13 "net/http" 14 15) 16 17func Echo(ws *websocket.Conn) { 18 19 var err error 20 21 for { 22 23 var reply string 24 25 //websocket接受信息 26 27 if err = websocket.Message.Receive(ws, &reply); err != nil { 28 29 fmt.Println("receive failed:", err) 30 31 break 32 33 } 34 35 fmt.Println("reveived from client: " + reply) 36 37 msg := "received:" + reply 38 39 fmt.Println("send to client:" + msg) 40 41 //这里是发送消息 42 43 if err = websocket.Message.Send(ws, msg); err != nil { 44 45 fmt.Println("send failed:", err) 46 47 break 48 49 } 50 51 } 52 53} 54 55func web(w http.ResponseWriter, r *http.Request) { 56 57 //打印请求的方法 58 59 fmt.Println("method", r.Method) 60 61 if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端 62 63 t, _ := template.ParseFiles("websocket.html") 64 65 t.Execute(w, nil) 66 67 } else { 68 69 //否则走打印输出post接受的参数username和password 70 71 fmt.Println(r.PostFormValue("username")) 72 73 fmt.Println(r.PostFormValue("password")) 74 75 } 76 77} 78 79func main() { 80 81 //接受websocket的路由地址 82 83 http.Handle("/websocket", websocket.Handler(Echo)) 84 85 //html页面 86 87 http.HandleFunc("/web", web) 88 89 if err := http.ListenAndServe(":1234", nil); err != nil { 90 91 log.Fatal("ListenAndServe:", err) 92 93 } 94 95}

###客户端代码 websocket.html

1<!DOCTYPE html> 2 3 <html> 4 5<head> 6 7 <meta charset="utf-8"/> 8 9 <title>go测试socket</title> 10 11</head> 12 13<body> 14 15 <script type="text/javascript"> 16 17 var sock = null; 18 19 var wsuri = "ws://127.0.0.1:1234/websocket"; 20 21 window.onload = function() { 22 23 console.log("onload"); 24 25 sock = new WebSocket(wsuri); 26 27 sock.onopen = function() { 28 29 console.log("connected to " + wsuri); 30 31 } 32 33 sock.onclose = function(e) { 34 35 console.log("connection closed (" + e.code + ")"); 36 37 } 38 39 sock.onmessage = function(e) { 40 41 console.log("message received: " + e.data); 42 43 } 44 45 }; 46 47 function send() { 48 49 var msg = document.getElementById('message').value; 50 51 sock.send(msg); 52 53 }; 54 55 </script> 56 57 <h1>WebSocket Echo Test</h1> 58 59 <form> 60 61 <p> 62 63 Message: <input id="message" type="text" value="Hello, world!"> 64 65 </p> 66 67 </form> 68 69 <button onclick="send();">Send Message</button> 70 71</body> 72 73</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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )