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
$ 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的更多相关文章
- golang vue 使用 websocket 的例子
一. 编写golang服务端 1.导入必要的websocket包,golang.org/x/net/websocket 或 github.com/golang/net/websocket 2.编写消息 ...
- golang gorilla websocket例子
WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...
- HTML5 直播协议之 WebSocket 和 MSE
当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 WebRTC. 今天我要向 ...
- WebSocket+MSE——HTML5 直播技术解析
作者 | 刘博(又拍云多媒体开发工程师) 当前为了满足比较火热的移动 Web 端直播需求,一系列的 HTML5 直播技术迅速的发展起来. 常见的可用于 HTML5 的直播技术有 HLS.WebSock ...
- [翻译自官方]什么是RDB和AOF? 一文了解Redis持久化!
概述 本文提供Redis持久化技术说明, 建议所有Redis用户阅读. 如果您想更深入了解Redis持久性原理机制和底层持久性保证, 请参考文章 揭秘Redis持久化: http://antire ...
- golang之websocket 源码分析
下载go的websocket包. 1. 通过google官方的方法, 需要hg来同步代码. 由于墙的原因, 还需要设置代理. 比较麻烦 2. http://gopm.io/ 通过该网站下载, 这是go ...
- golang(5):编写WebSocket服务,client和html5调用
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1.关于websocket HTML5定义了 ...
- WebSocket 和 Golang 实现聊天功能
http://www.open-open.com/lib/view/open1416379948711.html 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery ...
- Golang websocket推送
Golang websocket推送 在工作用主要使用的是Java,也做过IM(后端用的netty websocket).最近想通过Golang重写下,于是通过websocket撸了一个聊天室. 项目 ...
随机推荐
- ueditor 设置高度height. ue.setHeight(400); 设置宽度 width
1.引入的文件: <script type="text/javascript" src="../../dist/ueditor1_4_3-utf8-php/uedi ...
- ChinaCock界面控件介绍-CCNavigateTitle
先看一下实际项目中的运行效果,如图,通过品牌的导航栏,显示不同品牌的商品列表. 完全基于ChinaCock控件包中CCNavigateTitle组件实现的,这是一个可视控件,从组件面板上拖放一个到Fo ...
- Day3作业及默写
1.有变量量name = "aleX leNb" 完成如下操作: 移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip()) 移除 name 变 ...
- Js代码一些要素
---恢复内容开始--- 条件语句 is(条件){ 语句 }else { 语句 } {}在js中我们把他叫代码块.如果代码块里内容没有执行完,语句就不会向下执行. 代码块是一个独立的整体.如果js中莫 ...
- Python基础5--字符串
1 find().rfind().index().rindex().count() s = "this apple is red apple" s.find("apple ...
- linux 编译链接问题
-rpath和-rpath-link 假设有3个文件,在同一目录下,有这样的依赖关系 test->liba.so->libd.so 如果编译test的时候这样写 gcc test.c –l ...
- java用字符io流复制文件
一.小文件一次快速读写 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExceptio ...
- 【重要】NOI-1.2-10-字符串大小
10:Hello, World!的大小 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 还记得在上一章里,我们曾经输出过的“Hello, World!”吗? ...
- 在django中进行MySQL入库
在django中进行mysql 入库 需要导入 : from django.db import models 在添加主键时,需要使用: primary_key=True id = models. ...
- hdu-2196 树形dp 求一个树中所有节点能到达的最远距离f[i] (其实也不难嘛!)
#include <bits/stdc++.h> using namespace std; ; struct T { int to; int w; }; vector < vecto ...