私はゲームでウェブサイトを作っています。ゲームのために、私はデータ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 1とArticle 2と他のサイトから検索しました。ちょうどすべてが適切に機能するようにはできませんでした。
私はキーのポイントと、なぜそれらをエンコードしなければならないのか分かりません。
ソケットがブラウザに接続されており、私はそこからヘッダを取得しています。
ホスト:localhostを:25580
秒-のWebSocket-キー:iWLnXKrA3fLD6h6UGMIigg ==
ハンドシェイクしくみを教えてください。
私は、JavaでWebSocketサーバー用にあらかじめ作成されたクラスを選択することを強くお勧めします(たくさんあります)。あなたがあなたのコードで持っているより多くのことがあります。 – jfriend00
これはコードの25580ポート部分だけでした。私は余分なライブラリなしでこれをしたいと思います。 – Juubes