这个是我解析 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);