项目结构很简单,只有3个文件,大家可以把这三个文件排版成这种格式,然后导入。
步骤3
步骤四
直接下载代码 https://gitee.com/yinleilei/GoWebsocket,记得把 server.go
第四行 "**/**/impl"
,改成你在 mod.go
中设置的名字关于怎么用Goland新建一个已有的项目,请查看我这一篇 GoLand添加一个已有项目的相关配置
Go Mosules ( vgo )
类型的项目,所以要在根目录GWebsocket
下加一个 go.mod
文件module GoWebsocket
go build
,报错如下:go: cannot find main module; see 'go help modules'
go build
命令构建项目,在 GoLand添加一个已有项目的相关配置 已经设置了go第三方包自动导入
,所以可以看到已经成功引入了第三方扩展,如图:
大家同时可以看到 根目录GoWebsocket
下生成了2
个新文件
,如图
go.sum
:标记每个依赖包的版本 【Go专家编程】一文搞懂go.sum工作机制
GoWebsocket.exe
:可执行文件
GoLang中选择 client.html 文件,选择一种浏览器打开,如图
浏览器打开后,点击操作按钮打开
,关闭
,发送
,打印效果,如图
GoWebsocket
,在 server.go
中引入impl
下的所有文件中用到了import (
"GoWebsocket/impl"
"net/http"
"time"
"github.com/gorilla/websocket"
)
go run 入口文件
go run server.go
package main
import (
"GoWebsocket/impl"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var (
upgrader = websocket.Upgrader{
//允许跨域
CheckOrigin: func(r *http.Request) bool {
return true
},
}
)
func wsHandler(w http.ResponseWriter, r *http.Request) {
var (
wsConn *websocket.Conn
err error
data []byte
conn *impl.Connection
)
//Upgrade字段:websocket
if wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {
return
}
if conn, err = impl.InitConnection(wsConn); err != nil {
goto ERR
}
/**
这个是发送心跳
*/
go func() {
var (
err error
)
for {
if err = conn.WriteMessage([]byte("心跳")); err != nil {
return
}
time.Sleep(1 * time.Second)
}
}()
for {
if data, err = conn.ReadMessage(); err != nil {
goto ERR
}
if err = conn.WriteMessage(data); err != nil {
goto ERR
}
}
ERR:
conn.Close()
}
func main() {
http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8888", nil)
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>websocket实现消息推送title>
<script>
window.addEventListener("load",function (event) {
let output = document.getElementById("output")
let input = document.getElementById("input")
let ws
let print = function (message) {
let d=document.createElement("div")
d.innerHTML = message
output.appendChild(d)
}
document.getElementById("open").onclick = function (event) {
if(ws){
return false
}
ws = new WebSocket("ws://localhost:8888/ws")
ws.onopen = function (event) {
print("打开")
}
ws.onclose = function (event) {
print("关闭")
ws = null
}
ws.onmessage = function (event) {
print("响应:"+event.data)
}
ws.onerror = function (event) {
print("错误:"+event.data)
}
return false
}
document.getElementById("send").onclick = function (event) {
if(!ws){
return false
}
print("发送:"+input.value)
ws.send(input.value)
return false
}
document.getElementById("close").onclick = function (event) {
ws.close()
return false
}
})
script>
head>
<body>
<table>
<tr>
<td valign="top" width="50%">
<p>
点击:<br>
“打开”和服务端创建一个连接。<br>
"发送"发送一个消息给服务端。<br>
"关闭"去关闭连接.<br>
你可以改变消息Message并且发送多次.<br>
p>
<form>
<button id="open">打开button>
<button id="close">关闭button><br>
<input id="input" type="text" value="Websocket —— Go">
<button id="send">发送button><br>
form>
td>
<td valign="top" width="50%">
<div id="output">div>
td>
tr>
table>
body>
html>
package main
import (
"GoWebsocket/impl"
"net/http"
"time"
"github.com/gorilla/websocket"
)
var (
upgrader = websocket.Upgrader{
//允许跨域
CheckOrigin: func(r *http.Request) bool {
return true
},
}
)
func wsHandler(w http.ResponseWriter, r *http.Request) {
var (
wsConn *websocket.Conn
err error
data []byte
conn *impl.Connection
)
//Upgrade字段:websocket
if wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {
return
}
if conn, err = impl.InitConnection(wsConn); err != nil {
goto ERR
}
/**
这个是发送心跳
*/
go func() {
var (
err error
)
for {
if err = conn.WriteMessage([]byte("心跳")); err != nil {
return
}
time.Sleep(1 * time.Second)
}
}()
for {
if data, err = conn.ReadMessage(); err != nil {
goto ERR
}
if err = conn.WriteMessage(data); err != nil {
goto ERR
}
}
ERR:
conn.Close()
}
func main() {
http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8888", nil)
}