Websockets 如何区分正在发送的数据

Posted

技术标签:

【中文标题】Websockets 如何区分正在发送的数据【英文标题】:How Websockets distinguish the Data Being Sent 【发布时间】:2012-10-18 01:57:08 【问题描述】:

我正在阅读如何实现 websockets。现在我正在研究 fancywebsockets 的实现,因为它更容易设置。我的问题更适合理解 websockets,所以我想对此进行一些分类。

    你能控制WS正在发送的数据吗(IE客户端接收数据)?

    你如何处理,比如说私人消息场景,你也将消息存储在数据库中。如果您将文本存储在数据库中并在屏幕上显示消息,那么 WS 将如何将该更改应用于浏览该页面的其他人。 (WS 是否监听该 PAGE 中发生的所有更改?)。一个明显的例子是在 facebook 中,两个浏览同一面墙的人会看到墙所有者的更新?

    虽然有点无关,但很好奇的问题。如果 websockets 为我们提供了数据的实时更新,为什么没有人创建一个分叉版本的 Google Wave 服务。是不是因为不是每个浏览器都有明确的实现?

谢谢。

【问题讨论】:

【参考方案1】:

关于1.这个问题我真的不明白,Websockets连接和TCP连接是一样的,你可以在发回之前修改接收日期。 Bristleback Server中的简单示例(服务器获取已编辑用户状态的预览,然后检查其中是否包含非法字词,然后将状态的完整预览发送回用户:

@ActionClass
public class ClientNotificationUpdateAction 

  @Action
  public UserStatus previewEditedStatus(FacebookUser user, UserStatus status) 
    removeBadWords(status);
    return status;
  

关于 2. WebSockets 服务器拥有有关所有已连接用户的信息,因此可以简单地将消息发送给所有已连接用户,或者另外过滤以发送此通知,例如仅发送给亲密的朋友。这里还有一些代码(客户端更新他的状态并将这个状态发送回他的所有朋友)。

@ActionClass
public class ClientNotificationUpdateAction 

  @ObjectSender
  private ConditionObjectSender conditionObjectSender;

  @Action
  public void updateStatus(FacebookUser user, UserStatus status) throws Exception 
    SendCondition sendToFriendsOfUser = new FiendsOfUserCondition(user);

    BristleMessage message = ActionMessageFactory
      .createMessage("ClientNotificationUpdate", "updateStatus", status);
    conditionObjectSender.sendMessage(message, sendToFriendsOfUser);
  

关于 3. 确实不是所有的互联网浏览器都实现了 WebSockets 协议(尤其是在移动设备中)

【讨论】:

以上是关于Websockets 如何区分正在发送的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 WebSockets 响应 Web 服务请求

如何使用带有Rust的Actix Web和WebSockets发送服务器事件?

如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO

如何通过 websockets 在 ruby​​ on rails 和 reactJS 之间发送数据

即使网络中断,如何继续在 websockets 中发送消息?

如何在 asp.net core 中使用 websockets