欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

websocket实战(2) 信息处理发送、接收和编码

来源:本站整理 作者:佚名 时间:2016-09-24 TAG: 我要投稿

websocket 和传统意义上的socket编程虽然存在差别,但也存在相通概念,也分服务端和客户端。
主要区别
对于websocket,客户端的编写方式是通过JS编写回调函数完成交互;而传统socket,则需要连接端口,通过输入输出流来传递信息,完成交互;
传统的socket,服务端则需要绑定端口,通过accept 方法,等待客户端的连接。websocket 规范则把处理细节由web服务器来完成。
数据处理是websocket的一项主要工作。按工作阶段划分,主要包括以下方面。
信息发送
信息解码
信息编码
信息接收
按传递数据划分,分为
文本信息
二进制流信息
ping/pong信息
上面的内容,仅限于服务端,websocket html5相关暂时不讨论
1.信息发送( Sending Messages)
表示服务端,将消息传递给客户端(peer)
1.1将消息广播到所有连接客户端
@ServerEndpoint("/echoall")
public class EchoAllEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {//1
      try {
         for (Session sess : session.getOpenSessions()) {
            if (sess.isOpen())
               sess.getBasicRemote().sendText(msg);//2,3
         }
      } catch (IOException e) { ... }
   }
}
信息发送三步
1.Obtain the Session object from the connection.(通过在参数中添加Session,获取Session)
2.Use the Session object to obtain a RemoteEndpoint object.
3.Use the RemoteEndpoint object to send messages to the peer.
1.2返回值,作为信息发送
@OnMessage
public String onMessage(String message,Session session) {
    System.out.println("Received : "+ message);
    return message+"-"+session.getId();
}
2.信息解码和编码(codec)
拿打电话为例,如果电话双方,都用一样的标准普通话沟通,就没必要用翻译器了。如果电话双方,一边用着标准的牛津话,一方操着标准的山东土话,想想也能想想出来,沟通直接乱掉了,这时候必须要用到双方必须都需要翻译器了。websocket的编码和解码部分就是“翻译器”的角色。
编码及解码器位置

可以简单理解为:解码就是反序列化的过程;编码就是序列化的过程。
2.1 使用Encoders 反序列化对象
响应信息需要转换成二进制,才能进行网络传递。
来自j2ee的例子
1.实现Encoder.Text 或Encoder.Binary接口
public class MessageATextEncoder implements Encoder.Text {
   @Override
   public void init(EndpointConfig ec) { }
   @Override
   public void destroy() { }
   @Override
   public String encode(MessageA msgA) throws EncodeException {
      // Access msgA's properties and convert to JSON text...
      return msgAJsonString;
   }
}
2.将第一步中新建的Encoder,添加到ServerEndpoint 注解的encoders 属性中
@ServerEndpoint(
   value = "/myendpoint",
   encoders = { MessageATextEncoder.class, MessageBTextEncoder.class }
)
public class EncEndpoint { ... }
3.使用RemoteEndpoint.Basic or RemoteEndpoint.Async 的sendObject发送对象。
MessageA msgA = new MessageA(...);
MessageB msgB = new MessageB(...);
session.getBasicRemote.sendObject(msgA);
session.getBasicRemote.sendObject(msgB);
2.2 使用Decoders 序列化信息
将请求信息转换成对象,才方便ServerPoint处理响应
与Encoders处理步骤类似
1.实现Decoder.Text或Decoder.Binary接口
public class MessageTextDecoder implements Decoder.Text {
   @Override
   public void init(EndpointConfig ec) { }
   @Override
   public void destroy() { }
   @Override
   public Message decode(String string) throws DecodeException {
      // Read message...
      if ( /* message is an A message */ )
         return new MessageA(...);
      else if ( /* message is a B message */ )
         return new MessageB(...);
   }
   @Override
   public boolean willDecode(String string) {
      // Determine if the message can be converted into either a
      // MessageA object or a MessageB object...
      return canDecode;
   }
}
请注意willDecode方法,决定是否进行解码
2. 新建的Decoder,添加到ServerEndpoint 注解的decoders 属性中

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载