Golang高级编程:使用Websockets和Socket.IO教程

时间:2019-10-31 作者:golang

Golang高级编程:使用Websockets和Socket.IO教程

我觉得Websocket很有趣,因为它为我们提供了与标准RESTful API解决方案相对应的应用程序之间通信的替代选项。借助Socket,我们可以做很多很棒的事情,例如在成千上万的不同客户端之间进行实时通信,而不必花费每分钟打在服务器上的成千上万的RESTful API调用。

现实生活中的例子
透视事物并展示Websocket的重要性。想象一下,我们有一个聊天应用程序,它从一台服务器上获取所有最新消息,然后将所有新消息推送到该服务器上。

REST API方法
为了实现实时聊天,您必须每秒轮询提供新消息的REST API。
这相当于每个客户端每分钟大约60次REST API调用。
如果我们构建成功的服务,并且开始看到越来越多的流量冲击我们的应用程序,则我们的服务器将开始被淹没,每分钟处理数百万个REST API调用。
套接字示例
如果然后考虑使用websocket而不是REST API调用的方案:

每个客户端将维持与服务器的一个单独连接。
如果有1,000个客户端,我们只需要维护1,000个套接字连接即可。
如果有人发布新消息,则只有这样,我们的服务器才会push向我们的1,000个客户发布更新。
使用这种方法,我们可以最大程度地减少命中服务器的网络流量。我们已经节省了我们需要运行的服务器应用程序实例数量的成本,并且我们基本上可以毫不费力地处理数千个客户端。

实施Golang服务器

为了在Go中实现websocket,我们有很多不同的选择。我来自前端背景,前端中最流行的套接字通信库之一是socket-io,因此我们将使用等效的Golang以便于将它们集成在一起。

安装go-socket.io
我们可以使用以下go get命令安装软件包:

go get github.com/googollee/go-socket.io

 

 

然后我们可以将其包含在go程序中,如下所示:

import "github.com/googollee/go-socket.io"

 

简单服务器
让我们看一下readme.md正在使用的库中提供的示例代码。

main.go

package main

import (
    "log"
    "net/http"

    socketio "github.com/googollee/go-socket.io"
)

func main() {

    server, err := socketio.NewServer(nil)
    if err != nil {
        log.Fatal(err)
    }

    server.On("connection", func(so socketio.Socket) {

        log.Println("on connection")

        so.Join("chat")

        so.On("chat message", func(msg string) {
            log.Println("emit:", so.Emit("chat message", msg))
            so.BroadcastTo("chat", "chat message", msg)
        })

        so.On("disconnection", func() {
            log.Println("on disconnect")
        })
    })

    server.On("error", func(so socketio.Socket, err error) {
        log.Println("error:", err)
    })

    http.Handle("/socket.io/", server)

    fs := http.FileServer(http.Dir("static"))
    http.Handle("/", fs)

    log.Println("Serving at localhost:5000...")
    log.Fatal(http.ListenAndServe(":5000", nil))
}

 

分解
因此,在上面的代码示例中,我们在main()函数内进行了所有操作。我们首先socketio通过调用先定义一个新的服务器实例, socketio.NewServer(nil)然后再定义我们希望套接字服务器在连接时以及发生错误时所具有的行为。

在server.On(‘connection’,…)我们首先记录的日志中,已经成功建立了连接,然后chat使用进入会议室 so.Join(“chat”)。

之后,我们然后指定”chat message”通过连接的套接字之一接收事件时要发生的情况 。每当我们的服务器收到此类事件时,我们都会调用so.BroadcastTo(“chat”, “chat message”, msg)该事件 ,以广播发送到当前连接的每个套接字的任何消息。这意味着一个客户端将看到另一客户端要发送的任何消息。

最后,我们定义应该发生的情况”disconnection”,在这种情况下,我们只需记录一个客户已断开连接的事实即可。

前端客户端
好的,我们已经设法完善了基于Go的后端WebSocket服务器,但是现在是时候启动并运行一个简单的前端应用程序了,以便我们可以测试已完成的工作。

我们将从index.html在项目目录中创建一个简单的开始。

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Go WebSocket Tutorial</title>
  </head>
  <body>
    <h2>Hello World</h2>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
    <script>
      const socket = io("http://localhost:5000/socket.io/");
    </script>
  </body>
</html>

 

然后,您通过调用以下方式运行go websocket服务器:

$go run main.go

 

2018/06/10 07:54:06 Serving at localhost:5000...
2018/06/10 07:54:15 on connection
2018/06/10 07:54:16 on connection

 

然后应在上开始运行http://localhost:5000。然后,您应该能够在浏览器中导航到该URL,并在服务器的日志输出中看到正在建立的新连接。

您现在已经成功建立了一个可以直接连接到您新创建的后端Websocket服务器的前端!

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:2100506673@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。