我正在编写与 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/