这个是我解析 websocket 的代码,现在有一个小缺陷还不是很完善,当数据长度 大于 125 的时候就解析不出来了。 由于本人在二进制的运算上非常薄弱,所以在此请教一下大家。还望指点迷津。
// 这句代码可以获取到客户端传来的数据
byte[] bytesData = outputStream.toByteArray();
if (bytesData.length < 1) {
return null;
}
int opcode = bytesData[0] & 0x0f;
if (opcode == 8) {
webSocketExchange.setWebSocketEnum(WebSocketEnum.CLOSE);
return webSocketExchange;
}
if (bytesData.length < 2) {
return null;
}
int payloadLength = (bytesData[1] & 0x7f);
if(payloadLength < 1){
return null;
}
if(payloadLength == 126){
// TODO 需要研究下怎么获取数据长度
} else if(payloadLength == 127){
// TODO 需要研究下怎么获取数据长度
}
if(bytesData.length < (payloadLength + 6)){
return null;
}
byte[] mask = Arrays.copyOfRange(bytesData, 2, 6);
byte[] payloadData = Arrays.copyOfRange(bytesData, 6, payloadLength + 6);
if(payloadData.length < payloadLength){
return null;
}
for (int i = 0; i < payloadData.length; i++) {
payloadData[i] = (byte) (payloadData[i] ^ mask[i % 4]);
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(payloadData);
webSocketExchange.setLength(6 + outputStream.size());
webSocketExchange.setOutputStream(outputStream);
webSocketExchange.setWebSocketEnum(WebSocketEnum.MESSAGE);
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.