2011-07-15 9 views
1

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の最新バージョンでそれをテストしています。

ありがとうございます!

+0

実際にハンドシェイクリクエストの最後のバイトを追加しましたか(ウィキペディアの記事の '^ n:ds [4U ')ですか? – pimvdb

+0

あなたは正しいです、私は間違っています。今では、実際には最初の2048バイトをバイト配列に格納しています(悲しいことですが、それでもまだ動作しません: – arik

+1

ヘッダーとキーの間に2つの改行があり、すべての改行は '\ r \ nと '\ n'ではない。 – pimvdb

答えて

2

ご自分でサーバーを実装する場合は、最新バージョンのプロトコル(バージョン8、ドラフト10)を対象とします。

上記のハンドシェイクは古いバージョンのものです。

Chrome 14とFirefox 7/8が最新のバージョンをサポートしています。 Firefox 6には(古いバージョンでは無効になっている)古いバージョンがあります。 Chromeはどんなバージョンでもサポートを失う可能性があります。< 8.

+0

ああ、面白い!ありがとう! – arik

関連する問題