1

私は websocket4j ライブラリを使用しており、サーバー アプリケーションでの使用方法の例を見ました。そこからコードを取得し、以前は生のソケットを使用していた現在のプロジェクトに実装しました。どのクライアントを使用しても、ハンドシェイクが失敗したことを示す An IOExcpetion を取得しているようです。サンプルサーバーからコードを取得した原因がわかりません(これは明らかに動作するはずです)。JavaScriptサンプルクライアントを使用して、クライアントのせいではないことを確認しました。主な方法はこちら。

 public static void main(String args[]){
        BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
        System.out.print("PORT ( default - 1000 ): ");
        int port=1000;
        try{
            port=Integer.parseInt(b.readLine());
        }
        catch(Exception e){
            System.out.println("Wrong format. Using 1000 instead");
            port=1000;
        }
        System.out.println("Server Started. Waiting for connections");
        try{
            WebServerSocket listener=new WebServerSocket(port);
            while(true){
                WebSocket server=listener.accept();
                U413ChatServer connection=new U413ChatServer(server);
                Thread t=new Thread(connection); 
                t.start();
            }
        }
        catch(Exception e){ e.printStackTrace();
        }
    }

画面に表示されるのは次のとおりです

Server Started. Waiting for connections
java.io.IOException: Handshake failed
        at websocket4j.AbstractWebSocket.<init>(Unknown Source)
        at websocket4j.server.WebSocket.<init>(Unknown Source)
        at websocket4j.server.WebServerSocket.accept(Unknown Source)
        at U413ChatServer.main(U413ChatServer.java:55)
Caused by: java.io.IOException: Unexpected header field: Sec-WebSocket-Key: yfOg
xCbblVyY8ARVFyMtOw==
        at websocket4j.server.WebSocket.handshake(Unknown Source)
        at websocket4j.AbstractWebSocket$HandshakeRunner.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:47
1)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.lang.Thread.run(Thread.java:722)

55 行目は次のとおりです。

WebSocket server=listener.accept();

どんな助けでも本当に感謝します

4

2 に答える 2

1

クライアントが使用する WebSocket プロトコルは、サーバーのプロトコル バージョンと互換性がありません。

サーバーは古い (有効期限: 2011 年 2 月 17 日) WebSocket プロトコルのdraft-ietf-hybi-thewebsocketprotocol-latest を実装していますが、クライアントはRFC6455 (標準) のようなものを実装している可能性があります。

Netty や Jetty WebSocketServer などの他の実装を確認する必要があります。

于 2012-04-22T05:00:51.300 に答える
0

はい assylias は正しいです。使用している websocket4j キットは確かに古く、応答を行うには 2 つのキーとトークン値が必要です。これは、数値を 0 で割った例外またはストリームの終わりの例外のいずれかが原因で失敗します。

于 2013-03-07T02:33:54.453 に答える