Web_Sockets简单应用及介绍

简单应用及介绍

​ 对于websocket技术,让我回想起来了之前,在完成一个系统的时候,我们想做一个通讯的功能,这个时候我们不知道怎么做,我们想做的就是通过循环的访问接口,但是这样肯定还是无法完成这个功能的,因为确实不是实时通讯的效果。

​ 然后接触到了这个websocket技术,查看了介绍过后,我们觉得这个技术,其实就是将http进行了一个升级,升级成了一个websocket的协议过程。

介绍

​ websocket技术,实现实时通信的技术,这里我们通过建立一个TCP链接,然后通过TCP双工通道,进行数据的传输。

Web_Sockets简单应用及介绍_第1张图片

上面就是做到实时通信的两种方式,第一个轮询是其实不算真正意义上的实时通讯。

解决的问题:

  1. http存在的问题

    • 在请求的时候是客户端主动发起的,服务端不能主动发起。
    • 请求是一来一回的,并且每一次都是需要加上header头的。这个是非常消耗时间的。
    • 无状态的,这样就会存在一个问题,就是不知道这个请求的用户是谁。
  2. 长轮询问题

    前面我们说到了,实现实时的传输的时候,使用ajax就要使用的是轮询。一直访问,然后等待数据有修改的时候,

    这个时候就返回,然后这个请求还需要客户端进行发起。其实就是对资源的浪费

GO中websocket的应用

在go中,查阅了资料,最后我选用的库是:

go get github.com/gorilla/websocket

这个库是比较常用的。然后我们来简单的使用一下讲解。

使用流程

Web_Sockets简单应用及介绍_第2张图片

从上面的图中,我们可以看到几个关键的流程,也就是最基本的几个流程。

  1. 创建webSocket对象

    在这里我们要使用这个库的东西,我们首先是要先创建这个结构的,所以我们创建了这个对象:

    //创建websockt对象
    var upgrader = websocket.Upgrader{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
    }

    在这里我们就创建了一个全局的连接对象,然后我们使用这个对象去获取webSocket的连接

  2. 获取webSocket连接

    获取连接我们需要使用Upgrede来进行conn的获取,具体的代码如下:

    conn, err := (&websocket.Upgrader{
            CheckOrigin: func(r *http.Request) bool {
                return isvalida
            },
        }).Upgrade(writer, request, nil)

    这里我们可以看到,中间有一个CheckOrigin函数,我们使用这个函数,可以决定我们是不是返回这个连接,这里我们可以对isvalida进行操作,例如:我们在做一个聊天的软件,这个时候我们需要验证这个用户,是不是我们的用户,我们验证成功后我们将isvalida的值转换为true,当然我们如果不指定这个CheckOrigin函数,这个时候这个函数返回的就是true。前面是对结构的增加,也就是一个判断函数。后面调用了Upgrade,来获取连接的对象。

  3. 接收消息和发送消息

    • 接收消息

      接收消息,我们接收客户端发送回来的消息,然后进行处理,这里关键的函数是:ReadMessage。

      func (c *Conn) ReadMessage() (messageType int, p []byte, err error)

      返回三个参数,第一个参数是返回信息类型,第二个是消息体,最后是错误返回

    • 发送消息

      给客户端主动的发送消息,关键的函数是:WriteMessage。

      func (c *Conn) WriteMessage(messageType int, data []byte) error

      这里有三个参数,第一个是消息的类型,第二个是消息体,然后返回一个错误。

上面就是简单的使用流程和关键的步骤。

WebSockets_demo

你可能感兴趣的