我正在尝试构建一个基于 Java 的 HTML5 websocket 服务器 (v76),但在握手方面遇到问题。有一些开源 Java 解决方案据称支持 v76,但似乎都不起作用。
我确定我的握手响应是正确的(至少计算两个 key 的响应)。我的问题:Java默认是Big Endian吗?由于两个关键答案+响应字节的串联是握手答案,我必须进行多次类型转换(字符串到整数,将两个整数连接成一个字符串,然后转换为字节并与响应字节连接,然后MD5编码),有什么特别需要寻找的吗?使用 Wireshark(字节数)我的响应似乎总是准确的,但由于客户端没有调试信息,因此很难判断为什么我的握手失败。
任何支持答案或工作代码对我来说都非常有值(value)。
最佳答案
嘿,这是 websockets 版本 76 的握手生成器的工作示例。如果您使用规范 ( http://tools.ietf.org/pdf/draft-hixie-thewebsocketprotocol-76.pdf ) 中的示例并将输出打印为字符串,它将产生正确的答案。
public byte[] getHandshake (String firstKey, String secondKey, byte[] last8)
{
byte[] toReturn = null;
//Strip out numbers
int firstNum = Integer.parseInt(firstKey.replaceAll("\\D", ""));
int secondNum = Integer.parseInt(secondKey.replaceAll("\\D", ""));
//Count spaces
int firstDiv = firstKey.replaceAll("\\S", "").length();
int secondDiv = secondKey.replaceAll("\\S", "").length();
//Do the division
int firstShake = firstNum / firstDiv;
int secondShake = secondNum / secondDiv;
//Prepare 128 bit byte array
byte[] toMD5 = new byte[16];
byte[] firstByte = ByteBuffer.allocate(4).putInt(firstShake).array();
byte[] secondByte = ByteBuffer.allocate(4).putInt(secondShake).array();
//Copy the bytes of the numbers you made into your md5 byte array
System.arraycopy(firstByte, 0, toMD5, 0, 4);
System.arraycopy(secondByte, 0, toMD5, 4, 4);
System.arraycopy(last8, 0, toMD5, 8, 8);
try
{
//MD5 everything together
MessageDigest md5 = MessageDigest.getInstance("MD5");
toReturn = md5.digest(toMD5);
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return toReturn;
}
这是我写的,所以请随意使用它。
编辑:我遇到的一些其他问题 - 您必须将握手的“答案”写为字节。如果您尝试将其作为字符串写回流,它将失败(一定与字符转换有关?)。另外,请确保您编写的握手响应的其余部分完全按照规范中所示。
关于java - HTML5 Websocket 服务器握手 (v.76) (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426414/