Websocket @OnMessage永远不会为仅二进制消息文本触发

时间:2014-11-18 18:31:53

标签: java tomcat websocket tomcat7 bytebuffer

我在java代码中使用clientserver端点编写websocket通信(使用tomcat 7.0.53作为Web服务器)当我使用{{1}发送文本消息时方法session.getbasicremote.sendText(String)函数被触发和一切。但是我想在websockets之间发送二进制数据,因此必须使用@Onmessage。然后应该在以下方法中读取代码,

session.getbasicremote.sendBinary(ByteBuffer)

但是,在发送消息时永远不会触发该方法(我通过远程调试和打印语句进行调试以验证二进制数据是否也被发送也是@OnMessage public void recieved(ByteBuffer byteBuffer) { System.out.println(byteBuffer); } 时是通过此方法发送的常规文本切换到binary)。有没有人知道为什么从websocket的另一端发送数据时从未调用过这个方法?这里也是通过websocket发送二进制数据的部分的代码。此外,text方法也在类中,从不调用。

@onError

1 个答案:

答案 0 :(得分:1)

添加ByteBuffer翻转方法将完成代码现在如下所示的技巧,

public void SendMessage() throws IOException
{
    for(int i = 0;i<MESSAGE_SIZE;i++)
        message+='\0';
    for(int i = 0;i<ID_SIZE;i++)
        id+='\0';
    ByteBuffer bbuf = ByteBuffer.allocate(1000);
    bbuf.put(id.getBytes());
    bbuf.position(33);
    bbuf.putInt(33,length);
    bbuf.position(37);
    bbuf.put(message.getBytes());
    bbuf.flip();
    for(Session session : sessionList)
        session.getAsyncRemote().sendBinary(bbuf);
    System.out.println("sent");
}

根据API文档"the limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded. After a sequence of channel-read or put operations, invoke this method to prepare for a sequence of channel-write or relative get operations",翻转方法如下。