java - Websocket @OnMessage 永远不会触发二进制消息,只有文本

标签 java tomcat websocket tomcat7 bytebuffer

我正在编写与 client 的 websocket 通信和 server Java 代码中的端点(使用 tomcat 7.0.53 作为 Web 服务器)当我使用 session.getbasicremote.sendText(String) 发送短信时方法@Onmessage功能被解雇和一切。但是我想在 websockets 之间发送二进制数据,所以必须使用 session.getbasicremote.sendBinary(ByteBuffer) .然后应在以下方法中读取代码,

@OnMessage
public void recieved(ByteBuffer byteBuffer)
{
    System.out.println(byteBuffer);
}

然而,当消息被发送时,该方法永远不会被触发(我通过远程调试和打印语句进行调试,以验证是否正在发送二进制数据,是的,当 binary 切换到时,常规文本确实通过此方法发送text)。有谁知道为什么从 websocket 的另一端发送数据时永远不会调用此方法?这也是通过 websocket 发送二进制数据的部分的代码。还有 @onError方法在类中并且从未被调用。

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());
    for(Session session : sessionList)
        session.getAsyncRemote().sendBinary(bbuf);
    System.out.println("sent");
}

最佳答案

添加 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文档,翻转方法如下,“将限制设置为当前位置,然后将位置设置为零。如果定义了标记,则将其丢弃。 在一系列 channel 读取或放置操作之后,调用此方法为一系列 channel 写入或相关获取操作做准备”

关于java - Websocket @OnMessage 永远不会触发二进制消息,只有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001452/

相关文章:

tomcat - Windows7 ApacheDS 安装 - 它是否也安装 Tomcat?

javascript - 错误设置 wss 服务器 : works on localhost, 但不是 IP 地址

python - 在 Pusher 客户端中接收事件

java - Swing:与标签相比的复选框间距

java - 使用 Java 的 Akka 远程路由

java - Spring Framework 3.0中如何在所有页面显示相同的数据?

spring - Grails 3 session 超时在部署到 Tomcat 时不起作用

java - 配置 Tomcat 以将 Windows 证书存储用于 SSL

c# - 在 .net 4.5 中使用 ClientWebSocket 时如何设置 User-Agent 和 Referer header ?

java - 关闭使用 FileOutputStream 创建的文件,以便进行下一次删除