[英]HTML5 Websocket Server handshake (v.76) (Java)
我正在嘗試構建基於Java的HTML5 Websocket服務器(v76),握手時遇到問題。 有一些開源Java解決方案據稱支持v76,但似乎都不起作用。
我確定我的握手響應是正確的(至少計算了兩個鍵的響應)。 我的問題:Java默認是Big Endian嗎? 由於兩個關鍵答案+響應字節的連接是握手答案,因此我必須進行多種類型轉換(將字符串轉換為int,將兩個int合並為字符串,然后轉換為byte並使用響應字節進行concat,然后MD5編碼),是否特別需要尋找? 使用Wireshark(字節數),我的響應似乎總是准確的,但是由於客戶端沒有調試信息,因此很難說出握手失敗的原因。
任何支持性答案或有效代碼對我來說都是非常寶貴的。
嘿,這是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;
}
我寫了這個,所以隨時隨地都可以使用它。
編輯:我遇到的其他一些問題-您必須將“答案”以字節的形式寫入握手。 如果嘗試將其作為字符串寫回到流中,它將失敗(一定與char轉換有關嗎?)。 另外,請確保您將其余的響應完全按照規范中的說明編寫。
Jetty 7支持Web套接字,並且是開源的。 您可能會找到靈感(但我建議您只是將Jetty嵌入應用程序中並完成它)。
您可以嘗試我的實現: https : //github.com/TooTallNate/Java-WebSocket
目前支持草案75和76。 已通過當前版本的Chrome和Safari驗證。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.