首页 > 其他分享 >Go语言用WebSocket的简单例子

Go语言用WebSocket的简单例子

时间:2023-07-18 21:02:51浏览次数:45  
标签:function websocket evt go 例子 Go WebSocket com

Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持,需要独立下载, Go websocket package 下载地址:http://code.google.com/p/go.net/websocket 。

Go get 命令下载:go get code.google.com/p/go.net/websocket 
Go实现的WebSocket的文档:http://godoc.org/code.google.com/p/go.net/websocket

WebSocket官网提供了一个webSocket测试地址: http://www.websocket.org/echo.html  在这里输入 websocket的地址就可以进行测试。

Go服务器端源码:

package main
 
import (
    "code.google.com/p/go.net/websocket"
    "fmt"
    "log"
    "net/http"
)
 
func Echo(ws *websocket.Conn) {
var err error
 
for
 
var reply string
 
if err = websocket.Message.Receive(ws, &reply); err != nil
"Can't receive")
break
        }
 
"Received back from client: " +
 
:= "Received:  " +
"Sending to client: " +
 
if err = websocket.Message.Send(ws, msg); err != nil
"Can't send")
break
        }
    }
}
 
func
"begin")
"/", http.FileServer(http.Dir("."))) // <-- note this line
 
"/socket", websocket.Handler(Echo))
 
if err := http.ListenAndServe(":1234", nil); err != nil
"ListenAndServe:", err)
    }
 
"end")
}

测试的网页:

<!DOCTYPE html>  
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script language="javascript"type="text/javascript">  
 
var wsUri ="ws://localhost:1234/socket"; 
//var wsUri = "ws://localhost/socket"; 
//var wsUri = "ws://echo.websocket.org"; 
var
function
= document.getElementById("output"); 
    testWebSocket(); 
}  
function testWebSocket() { websocket = new
= function(evt) { onOpen(evt) }; 
= function(evt) { onClose(evt) }; 
= function(evt) { onMessage(evt) }; 
= function(evt) { one rror(evt) }; }  
 
function onOpen(evt) { writeToScreen("CONNECTED"); doSend("WebSocket rocks"); }  function
"DISCONNECTED"); }  
 
function
        writeToScreen('<span style="color: blue;">RESPONSE: '+ evt.data+'</span>'); 
        websocket.close(); }  
 
function
        writeToScreen('<span style="color: red;">ERROR:</span> '+ evt.data); }  
 
function
"SENT: " +
        websocket.send(message); }  
 
function
var pre = document.createElement("p"); 
= "break-word"; 
=
 
window.addEventListener("load", init, false);  
</script>
 
 
<h2>WebSocket Test</h2>
<div id="output"></div>
  </html>

注意,测试时候 测试html网页是需要在 http://localhost:1234/test.html 这样的地址进行测试。

如果用 file://localhost/Users/cybercare/go/src/websocket/test.html 测试会报错误。 

 Chrome浏览器可能会抛出400错误,是因为它认为你正在尝试做一个跨域请求WebSocket。即它认为你没有跨域请求的权限。You should host your html+javascript on http:// (or https://), not file://

Go语言用WebSocket的简单例子_Go

Static html page created the WebSocket connection golang server directly
http://stackoverflow.com/questions/15884480/static-html-page-created-the-websocket-connection-golang-server-directly

 

Go websocket server not working with browser
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/pNYy5brIF6E

 

不过如果使用 file://localhost/Users/cybercare/go/src/websocket/test.html 访问访问 

var wsUri = "ws://echo.websocket.org";   则不会有任何问题,而访问 var wsUri = "ws://localhost:1234/socket"; 就会报上面错误:

 

使用

打开 chrome://net-internals/#events, 输入ws进行过滤,其中的 SOCKET_STREAM 信息如下:

下面是本地静态文件请求 ws://echo.websocket.org/ 的信息截屏。

Go语言用WebSocket的简单例子_Go_02

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Websockets?
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/2QwiBb7ZgrA

 

本地静态文件请求 ws://localhost:1234/socket

 

 

Go语言用WebSocket的简单例子_Go_03

 

 

 

这是因为 我们用的这个 websocket 框架 在处理请求的 Origin 时,把它当URL来处理,而本地静态文件发送上来的Origin是null。这里解析错误就会报400错误。

go 官方的这个Orgin解析代码我们可以在下面地址看到(536行):

https://code.google.com/p/go/source/browse/websocket/hixie.go?repo=net#536

 

Go语言用WebSocket的简单例子_html_04

 

 

 

 

 

 


 

https://code.google.com/p/go/source/browse/websocket/server.go?spec=svn.net.9c2295dac419afbe918298a9c90f49786819b569&repo=net&r=2513e900821392c12653a526c6e36a2d3db4da5c#28

 

 

参考资料

go-websocket-sample
https://github.com/ukai/go-websocket-sample

Can't connect to Server through Chrome.
https://code.google.com/p/go/issues/detail?id=3987

Go WebSocket开发

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

广泛意思上的websocket包
http://bbs.mygolang.com/thread-330-1-1.html

golang websocket总结(问题贴)

基于Golang的WebSocket Server
http://www.xinze.me/%E5%9F%BA%E4%BA%8Egolang%E7%9A%84websocket-server/

标签:function,websocket,evt,go,例子,Go,WebSocket,com
From: https://blog.51cto.com/u_15588078/6768265

相关文章

  • Golang做的验证码(2)
    前面一篇文章介绍了2个用Golang做的验证码 这里再补充几个:1、在GAE上使用的Google的验证码(ReCAPTCHA)封装https://github.com/ThePiachu/GAE-Go-ReCAPTCHA这个的核心代码只在下面这个文件:https://github.com/ThePiachu/GAE-Go-ReCAPTCHA/blob/master/ReCaptcha/ReCaptcha.go 2、一......
  • Golang连接Oracle数据库
    Golang连接Oracle的库有很多,比较常见的如下:不过,oralce只提供了oci8的接口,必须通过它来调用,所以下面方案都逃不过相关设置。1、go-db-oracle地址:https://code.google.com/p/go-db-oracle/官方介绍:OracleDriverusingcgotocallOCIlibrariesfromOracleInstantClient11.......
  • Nginx 代理 WebSocket 、TCP协议
    Nginx代理WebSocket什么是WebSocketWebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket中的握手和HTTP中的握手过程兼容,且可以使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。代理结构WebSocket可以工作在......
  • java mongo 插入geometry 多边形 线 点
    importcom.mongodb.client.MongoCollection;importcom.mongodb.client.model.geojson.LineString;importcom.mongodb.client.model.geojson.Point;importcom.mongodb.client.model.geojson.Polygon;importcom.mongodb.client.model.geojson.Position;importcom.tusvn.cc......
  • Go语言读取网上Json格式的天气预报数据例子
    天气预报接口使用的是:http://www.weather.com.cn/data/sk/101010100.html这里的Json数据如下:{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"1......
  • Sublime Text 2下配置Go语言环境
    安装SublimeText2SublimeText2下载地址:http://www.sublimetext.com/2 SublimeText2可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。我下载的是Mac版的,安装只需要简单的把dmg包打开,把应用文件拖动到Application中即可。......
  • Go安装的设置问题:GOROOT,GOPATH
    Mac下使用Google官方的Go语言安装包:https://code.google.com/p/go/downloads/list 安装的Go,会自动把/usr/local/go/bin目录加入PATH中。这样我们直接在控制台就可以执行go语言的一些命令。http://golang.org/cmd/go/#hdr-GOPATH_environment_variable 下面使用export命令看到......
  • nginx 中根据 $http_upgrade 变量将 HTTP 连接升级为 WebSocket 连接
    配置“$connection_upgrade”变量连接升级通常与WebSockets结合使用。在nginx中,我们可以根据$http_upgrade变量将HTTP连接升级为WebSocket连接。我们可以使用map块在nginx中定义连接和http升级之间的依赖关系:vimnginx.confmap$http_upgrade$connection_......
  • socket应用的例子
    当使用C语言实现Socket编程时,可以通过系统提供的网络库来实现网络通信。以下是一个简单的示例,演示了如何创建一个简单的服务器和客户端,实现客户端向服务器发送消息并接收回复的功能。服务器端(server.c)#include<stdio.h>#include<stdlib.h>#include<string.h>#include......
  • centos7 下全局配置最新版的golang语言开发环境
    按照以下步骤进行操作:前往Go官方网站下载页面(https://golang.org/dl/)查找最新版本的Go二进制文件。使用wget命令下载最新版本的Go二进制文件。例如,如果最新版本是1.17,执行以下命令:$wgethttps://golang.org/dl/go1.17.linux-amd64.tar.gz解压缩下载的压缩包:$sudota......