我正在尝试构建基于Java的HTML5 websocket服务器(v76)并且在握手方面存在问题。有一些开源Java解决方案可能支持v76,但它们似乎都不起作用。
我确信我的握手响应是正确的(至少计算两个键的响应)。我的问题:Java默认是Big Endian吗?由于两个关键答案+响应字节的串联是握手答案,我必须进行多种类型的转换(字符串到int,将两个整数连接成一个字符串,然后转换为字节并用响应字节连接,然后MD5编码),有什么特别需要我寻找的吗?使用Wireshark(字节数),我的响应似乎总是准确的,但由于客户端没有调试信息,因此很难说出为什么我的握手失败了。
任何支持性答案或工作代码对我来说都非常有价值。
答案 0 :(得分:1)
嘿,这是websockets版本76的握手生成器的一个工作示例。如果您使用spec(http://tools.ietf.org/pdf/draft-hixie-thewebsocketprotocol-76.pdf)中的示例并将输出打印为String,则会生成正确的答案。
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;
}
我写了这个,所以随时随地使用它。
编辑:我遇到的其他一些问题 - 您必须将握手的'答案'写为字节。如果你尝试将它作为String写回流中,它将失败(必须与char转换有关吗?)。另外,请确保完全按照规范中的说明将剩余的响应写入握手。
答案 1 :(得分:0)
Jetty 7支持Web套接字,并且是开源的。你可能会找到灵感(但我建议你在你的应用程序中嵌入Jetty并完成它)。
答案 2 :(得分:0)
您可以尝试我的实施: https://github.com/TooTallNate/Java-WebSocket
目前支持75和76草案。已通过Chrome和Safari的当前版本验证。祝你好运!