Golang使用WebSocket通信的实现

 更新时间:2021年02月21日 10:29:08   作者:有理叔  
这篇文章主要介绍了Golang使用WebSocket通信的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

使用Golang能够创建WebSocket通信,只需要使用golang.org/x/net/websocket包即可,该包有可能被墙,无法使用go get下载,但是我们可以从golang中国提供的地址下载,然后将包放在对应的路径下。

WebSocket是一种通信协议,旨在改善HTTP作为无状态协议通信的效率问题,WebSocket是客户端与服务器之间的全双工连接,客户端和服务器只需要建立一次连接就可以使用该连接进行通信。在我们的项目中,一般客户端是前端页面,使用JavaScript创建WebSocket与后端的WebSocket服务端进行通信。

下面首先看看我们的服务端代码

package main
 
import (
 "fmt"
 "html/template"
 "net/http"
 "os"
 "strings"
 
 "golang.org/x/net/websocket"
)
 
func upper(ws *websocket.Conn) {
 var err error
 for {
 var reply string
 
 if err = websocket.Message.Receive(ws, &reply); err != nil {
  fmt.Println(err)
  continue
 }
 
 if err = websocket.Message.Send(ws, strings.ToUpper(reply)); err != nil {
  fmt.Println(err)
  continue
 }
 }
}
 
func index(w http.ResponseWriter, r *http.Request) {
 if r.Method != "GET" {
 return
 }
 
 t, _ := template.ParseFiles("index.html")
 t.Execute(w, nil)
}
 
func main() {
 http.Handle("/upper", websocket.Handler(upper))
 http.HandleFunc("/", index)
 
 if err := http.ListenAndServe(":9999", nil); err != nil {
 fmt.Println(err)
 os.Exit(1)
 }
}

我们从main函数看起,我们使用Golang的http包创建了一个Server,该Server能够处理两个请求,一个是/,这是Web项目的根路径,index函数作为处理方法,返回首页index.html。

Server还处理/upper请求,该请求的处理函数是一个WebSocket的处理函数,它包裹了我们自己定义的upper函数,upper函数有一个参数,就是服务端创建好的WebSocket连接,upper函数逻辑很简单,通过WebSocket连接读取服务器的请求内容,将内容转化为大写后,通过WebSocket将结果返回给客户端。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>Websocket</title>
</head>
<body>
  <h1>字符串转换大写</h1>
  <form>
    <p>
      字符串: <input id="content" type="text" placeholder="输入要转换的字符串">
    </p>
  </form>
  <label id="result">结果为:</label><br><br>
  <button onclick="send()">转换</button>
 
  <script type="text/javascript">
    var sock = null;
    var wsuri = "ws://127.0.0.1:9999/upper";
    sock = new WebSocket(wsuri);
    sock.onmessage = function(e) {
      var result = document.getElementById('result');
      result.innerHTML = "结果为:" + e.data;
    }
 
    function send() {
      var msg = document.getElementById('content').value;
      sock.send(msg);
    }
  </script>
</body>
</html>

前端页面我们主要看JavaScript代码部分,首先建立一个全局的WebSocket,之后点击转换按钮时,就会将input的内容通过WebSocket发送出去。WebSocket的onmessage函数用来处理服务端的响应,还有onerror,onclose等方法,分别是WebSocket的错误回调和关闭回调,本文并没有使用,一般用来处理资源回收和报错。

Golang可以很方便的使用WebSocket,只是使用websocket.Handler包裹一个处理函数即可。

到此这篇关于Golang使用WebSocket通信的实现的文章就介绍到这了,更多相关Golang WebSocket通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Go HTTP客户端打造高性能服务

    使用Go HTTP客户端打造高性能服务

    大多数语言都有提供各自的 HTTP 客户端,本文将动手实践如何使用Go语言发起HTTP请求,并讨论其中有可能遇到的问题。具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Go语言并发技术详解

    Go语言并发技术详解

    这篇文章主要介绍了Go语言并发技术详解,本文讲解了goroutine、channels、Buffered Channels、Range和Close等内容,需要的朋友可以参考下
    2014-10-10
  • go slice 数组和切片使用区别示例解析

    go slice 数组和切片使用区别示例解析

    这篇文章主要为大家介绍了go slice 数组和切片使用区别示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go语言map元素的删除和清空

    Go语言map元素的删除和清空

    本文主要介绍了Go语言map元素的删除和清空,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言学习教程之结构体的示例详解

    Go语言学习教程之结构体的示例详解

    结构体是一个序列,包含一些被命名的元素,这些被命名的元素称为字段(field),每个字段有一个名字和一个类型。本文通过一些示例带大家深入了解Go语言中结构体的使用,需要的可以参考一下
    2022-09-09
  • golang 实现 pdf 转高清晰度 jpeg的处理方法

    golang 实现 pdf 转高清晰度 jpeg的处理方法

    这篇文章主要介绍了golang 实现 pdf 转高清晰度 jpeg,下面主要介绍Golang 代码使用方法及Golang PDF转JPEG的详细代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Golang 单元测试和基准测试实例详解

    Golang 单元测试和基准测试实例详解

    这篇文章主要为大家介绍了Golang 单元测试和基准测试实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • go语言中的面向对象

    go语言中的面向对象

    Go不支持类,而是提供了结构体。结构体中可以添加属性和方法。这样可以将数据和操作数据的方法绑定在一起,实现与类相似的效果。这篇文章介绍了go语言中的面向对象,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • golang解析html网页的方法

    golang解析html网页的方法

    今天小编就为大家分享一篇golang解析html网页的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • golang 实现tcp server端和client端,并计算RTT时间操作

    golang 实现tcp server端和client端,并计算RTT时间操作

    这篇文章主要介绍了golang 实现tcp server端和client端,并计算RTT时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论