三分钟轻松用上WebSocket服务

channel服务已经支持公网API

各位开发者,新浪云支持的channel服务当前已经支持从公网API调用创建连接和发送消息接口,且该服务免费。

公网的API如何使用请参考channel服务的说明文档:http://www.sinacloud.com/doc/api.html#channel-fu-wu-websocket

一个真实的用例演示如何使用

使用前需要了解

新浪云提供的websocket服务不能通过连接上行说明,需要通过单独的接口以HTTP的方式上行。

示意图

第一步-获取websocket连接地址

网页在渲染完成时调用create_channel.php接口获取一个websocket链接信息,其中client_id也就是channel的名称,由客户端提供,调用成功时服务端会返还一个websocket链接地址。

第二步-连接到websocket服务

通过新建一个WebSocket对象,并将websocket的open、message、close、error四个事件托管到本地的四个方法,如果对此不是很理解,请阅读VUE的代码https://cn.vuejs.org/

this.websock = new WebSocket(ws_uri);  
this.websock.onopen = this.WebSocketOpen;  
this.websock.onmessage = this.WebSocketOnMessage;  
this.websock.onclose = this.WebSocketClose;  
this.websock.onerror = this.WebSocketError;  

第三步 - 消息发送

如上所说,消息不能通过websocket的连接上行,需要单独通过HTTP接口将数据发送给自己封装的HTTP API,由这个HTTP API通过新浪云提供的GAPI将说明写入到websocket。

关于wss

channel服务提供wss服务,但现在默认创建连接时返回的连接地址是一个ws://地址,需要你手工将其替换为wss,PHP替换的方式,其他的开发语言可以参考实现:

// 将ws://替换为wss://
$web_socket_address = 'wss'.substr($web_socket_address, 2);

连接后

示例连接后:

发送一条消息

发送数据后可以看到从websocket的frame中看到了数据,且在消息列表页面中出现了。

关于广播

channel服务不支持广播,如果用于多人聊天模式,请在服务端将client_id按组划分,使用memcached服务器存储一个逻辑分组中的所有连接,在有消息上行是遍历组下的所有的连接发送消息。

每一个客户端应该使用不同的标记client_id,重复使用会发生无法预料的后果。

在线测试

https://gequ.sinaapp.com/channel-gapi/

源码

以上源码已经开放在新浪云的Github,https://github.com/sinacloud/websocket-gapi-example

如果代码不在新浪云环境执行,需要注意以下两点:

  • 请将base.php中的配置参数由常量改为字符串:
// 这里的SAE_ACCESSKEY换为应用的ACCESSKEY
define('SAE_CHANNEL_ACCESSKEY', SAE_ACCESSKEY);  
// 这里的SAE_CHANNEL_SECRETKEY换为应用的SECRETKEY
define('SAE_CHANNEL_SECRETKEY', SAE_SECRETKEY);  
  • 放置代码的机器需要能访问公网,因为程序需要和新浪云GAPI网关通信。