简单应用及介绍
对于websocket技术,让我回想起来了之前,在完成一个系统的时候,我们想做一个通讯的功能,这个时候我们不知道怎么做,我们想做的就是通过循环的访问接口,但是这样肯定还是无法完成这个功能的,因为确实不是实时通讯的效果。
然后接触到了这个websocket技术,查看了介绍过后,我们觉得这个技术,其实就是将http进行了一个升级,升级成了一个websocket的协议过程。
介绍
websocket技术,实现实时通信的技术,这里我们通过建立一个TCP链接,然后通过TCP双工通道,进行数据的传输。
上面就是做到实时通信的两种方式,第一个轮询是其实不算真正意义上的实时通讯。
解决的问题:
http存在的问题
- 在请求的时候是客户端主动发起的,服务端不能主动发起。
- 请求是一来一回的,并且每一次都是需要加上header头的。这个是非常消耗时间的。
- 无状态的,这样就会存在一个问题,就是不知道这个请求的用户是谁。
长轮询问题
前面我们说到了,实现实时的传输的时候,使用ajax就要使用的是轮询。一直访问,然后等待数据有修改的时候,
这个时候就返回,然后这个请求还需要客户端进行发起。其实就是对资源的浪费
GO中websocket的应用
在go中,查阅了资料,最后我选用的库是:
go get github.com/gorilla/websocket
这个库是比较常用的。然后我们来简单的使用一下讲解。
使用流程
从上面的图中,我们可以看到几个关键的流程,也就是最基本的几个流程。
创建webSocket对象
在这里我们要使用这个库的东西,我们首先是要先创建这个结构的,所以我们创建了这个对象:
//创建websockt对象 var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, }
在这里我们就创建了一个全局的连接对象,然后我们使用这个对象去获取webSocket的连接
获取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,来获取连接的对象。
接收消息和发送消息
接收消息
接收消息,我们接收客户端发送回来的消息,然后进行处理,这里关键的函数是:ReadMessage。
func (c *Conn) ReadMessage() (messageType int, p []byte, err error)
返回三个参数,第一个参数是返回信息类型,第二个是消息体,最后是错误返回
发送消息
给客户端主动的发送消息,关键的函数是:WriteMessage。
func (c *Conn) WriteMessage(messageType int, data []byte) error
这里有三个参数,第一个是消息的类型,第二个是消息体,然后返回一个错误。
上面就是简单的使用流程和关键的步骤。