JavaでWebSocket Serverを作成しようとしています。Java ServerSocket WebSocket reply
が(14): GET/HTTP/1.1
(18): Upgrade: WebSocket
(19): Connection: Upgrade
(20): Host: localhost:8483
(24): Origin: http://localhost
(45): Sec-WebSocket-Key1: P3$04 H85Zf# 9 9d a0 x10[
(34): Sec-WebSocket-Key2: 416393 2 560Y
(0):
(括弧内の数字、括弧、コロンとスペースは、その後、唯一私がするSystem.out.printlnのために追加のもの(こと):、私は要求次取得
私のクライアントが接続
コマンド)。括弧内の数字は、行の長さ(バイト)です。私が最初にこの機能を使用して要求を処理:
public boolean processHandshake(int lineNumber, String line){
if(handshakeProcessed || lineNumber > 9 || lineNumber < 1){
return false;
}
switch(lineNumber){
case 1:{ handshakeGetLocation = line.replace("GET ", "").replace(" HTTP/1.1", ""); break; }
case 2:{ handshakeUpgrade = line.replace("Upgrade: ", ""); break; }
case 3:{ handshakeConnection = line.replace("Connection: ", ""); break; }
case 4:{ handshakeHost = line.replace("Host: : ", ""); break; }
case 5:{ handshakeOrigin = line.replace("Origin: ", ""); break; }
case 6:{ handshakeSecWebSocketKey1 = line.replace("Sec-WebSocket-Key1: ", ""); break; }
case 7:{ handshakeSecWebSocketKey2 = line.replace("Sec-WebSocket-Key2: ", ""); handshakeProcessed = false; break; }
case 8:{ handshakeProcessed = true; }
case 9:{ handshakeProcessed = true; }
}
return true;
}
は今、this記事によると、それは私が処理する必要があるプロトコルの最初のバージョンだと仮定すると、私はどのように対処する思ってきました商:
事は、各キーについて、スペースの数で桁数を分割する必要があります。私はそのようにそれを行ってきた:機能(replyHandshake()
)以下
private double calculateKeyReply(String key){
double numCount = key.replaceAll("[^0-9]", "").length();
double spaceCount = key.replaceAll("[^\\ ]", "").length();
System.out.println(numCount+"/"+spaceCount+"="+numCount/spaceCount);
return numCount/spaceCount;
}
、呼び出し:
String handshake;
handshake = "HTTP/1.1 101 WebSocket Protocol Handshake\n";
handshake += "Upgrade: "+handshakeUpgrade+"\n"; // handshakeUpgrade and the following variables are instance variables I set when I process the request
handshake += "Connection: "+handshakeConnection+"\n";
handshake += "Sec-WebSocket-Origin: "+handshakeOrigin+"\n";
handshake += "Sec-WebSocket-Location: "+handshakeOrigin.replace("http", "ws")+handshakeGetLocation+"\n";
handshake += "Sec-WebSocket-Protocol: sample\n";
// handshake += "\n";
String nums = calculateKeyReply(handshakeSecWebSocketKey1)+""+calculateKeyReply(handshakeSecWebSocketKey2);
MessageDigest md5Digestor = MessageDigest.getInstance("MD5");
String md5 = new String(md5Digestor.digest(nums.getBytes()));
handshake += md5;
return handshake;
そしてが、どこか別の場所:
out.println(replyHandshake());
は私が何か間違ったことをやっていますか?私はGoogle Chromeの最新バージョンでそれをテストしています。
ありがとうございます!
実際にハンドシェイクリクエストの最後のバイトを追加しましたか(ウィキペディアの記事の '^ n:ds [4U ')ですか? – pimvdb
あなたは正しいです、私は間違っています。今では、実際には最初の2048バイトをバイト配列に格納しています(悲しいことですが、それでもまだ動作しません: – arik
ヘッダーとキーの間に2つの改行があり、すべての改行は '\ r \ nと '\ n'ではない。 – pimvdb