2016-11-25 11 views
0

私はゲームでウェブサイトを作っています。ゲームのために、私はデータtroughtソケットを送信する必要があります。ページをロードするとすべてが正常に動作していますが、ハンドシェイクが動作するようにはできません。WebSocketハンドシェイクを完了するにはどうすればいいですか?

class ServerClient { 
    public ServerClient() { 
     handshake(); 
    } 

    private void handshake() { 
    try { 
     String line; 
     String key = ""; 
     boolean socketReq = false; 
     while (true) { 
      line = input.readLine(); 
      if (line.startsWith("Upgrade: websocket")) 
       socketReq = true; 
      if (line.startsWith("Sec-WebSocket-Key: ")) 
       key = line; 
      if (line.isEmpty()) 
       break; 
     } 
     if (!socketReq) 
      socket.close(); 
     String encodedKey = DatatypeConverter.printBase64Binary(
      MessageDigest.getInstance("SHA-1") 
       .digest((key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes())); 

     System.out.println(encodedKey); 
     output.println("HTTP/1.1 101 Switching Protocols"); 
     output.println("Upgrade: websocket"); 
     output.println("Connection: Upgrade"); 
     output.println("Sec-WebSocket-Accept: " + encodedKey); 
     output.flush(); 
     output.close();  // output = new PrintWriter(
          //  Socket.getOutputStream()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

私は誰もブラウザから直接localhost:25580に接続したくないので、socketReq変数があります。 私の送受信機能は異なるスレッドにあり、ハンドシェイク後に起動されます。

新しいのWebSocketの結果( "WS:// localhostを:25580") ':// localhostを:25580/WS' 失敗しました:のWebSocketハンドシェイク中にエラーが発生します。net JSでは、へ

のWebSocket接続があります:: ERR_CONNECTION_CLOSED

私はのWebSocketハンドシェイク中

エラー持っていた:不正 "秒-のWebSocket-受け入れる]ヘッダー値

でも、私はコード内で何か変わったと思います。

私は時間trought Article 1Article 2と他のサイトから検索しました。ちょうどすべてが適切に機能するようにはできませんでした。

私はキーのポイントと、なぜそれらをエンコードしなければならないのか分かりません。

ソケットがブラウザに接続されており、私はそこからヘッダを取得しています。

ホスト:localhostを:25580

秒-のWebSocket-キー:iWLnXKrA3fLD6h6UGMIigg ==

ハンドシェイクしくみを教えてください。

+1

私は、JavaでWebSocketサーバー用にあらかじめ作成されたクラスを選択することを強くお勧めします(たくさんあります)。あなたがあなたのコードで持っているより多くのことがあります。 – jfriend00

+1

これはコードの25580ポート部分だけでした。私は余分なライブラリなしでこれをしたいと思います。 – Juubes

答えて

0

完了!

http://blog.honeybadger.io/building-a-simple-websockets-server-from-scratch-in-ruby/から回答が見つかりました。完全に機能しています。

コード:

public ClientSocket(Socket socket) { 
    try { 
     this.socket = socket; 
     this.input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     this.output = new PrintWriter(socket.getOutputStream()); 
     handshake(); 
} 

private void handshake() { 
    try { 
     String line; 
     String key = ""; 
     while (true) { 
      line = input.readLine(); 
      if (line.startsWith("Sec-WebSocket-Key: ")) { 
       key = line.split(" ")[1]; 
       System.out.println("'" + key + "'"); 
      } 
      if (line == null || line.isEmpty()) 
       break; 
     } 
     output.println("HTTP/1.1 101 Switching Protocols"); 
     output.println("Upgrade: websocket"); 
     output.println("Connection: Upgrade"); 
     output.println("Sec-WebSocket-Accept: " + encode(key)); 
     output.println(); 
     output.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private String encode(String key) throws Exception { 
    key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 
    byte[] bytes = MessageDigest.getInstance("SHA-1").digest(key.getBytes()); 
    return DatatypeConverter.printBase64Binary(bytes); 
} 

は今、私はちょうどメッセージをデコードする必要があります。

0

output.close()で接続を終了しているため、net::ERR_CONNECTION_CLOSEDエラーが発生しています。

接続を開いたままにしたい場合は、明らかにハンドシェイク中に閉じないでください。

関連する問題