0

WeberknechtJavaライブラリを介してWebSocketに接続しようとしています。Javaクライアントが接続を作成しようとすると、次のエラーメッセージが表示されます。

W/System.err(805): java.lang.ArrayIndexOutOfBoundsException: length=1000; index=1000
W/System.err(805): at ...WebSocketConnection.connect(WebSocketConnection.java:86)

問題の原因となる部分は次のとおりです。

public void connect() throws WebSocketException {
    try {
        if (connected) {
            throw new WebSocketException("already connected");
        }

        socket = createSocket();
        input = new DataInputStream(socket.getInputStream());
        output = new PrintStream(socket.getOutputStream());

        output.write(handshake.getHandshake());

        boolean handshakeComplete = false;
        int len = 10000;
        byte[] buffer = new byte[len];
        int pos = 0;
        ArrayList<String> handshakeLines = new ArrayList<String>();

        while (!handshakeComplete) {
            int b = input.read();
            buffer[pos] = (byte) b; // THIS LINE CAUSES THE EXCEPTION
            pos += 1;

            if (buffer[pos - 1] == 0x0A && buffer[pos - 2] == 0x0D) {
                String line = new String(buffer, "UTF-8");
                if (line.trim().equals("")) {
                    handshakeComplete = true;
                } else {
                    handshakeLines.add(line.trim());
                }

                buffer = new byte[len];
                pos = 0;
            }
        }

この問題の原因は何ですか?このクライアントライブラリは、サーバーが使用するWebSocketバージョンに準拠していない可能性がありますか?

Weberknechtの向こうの問題はまだ解決されていません。この質問は非常に一般的な問題(WebSocketヘッダーとハンドシェイクデータの読み取り)のように思われるため、ここで質問したいと思います。

4

3 に答える 3

1

コードは-1from input.read() をチェックして、接続が EOF に達したことを示す必要があります。

また、同じビットのコードに基づいて、10000バイトの後にハンドシェイクが到達していない場合、それは無効なハンドシェイクであると想定します。

while (!handshakeComplete) {
            int b = input.read();

            if (b == -1)
                throw new WebSocketException ("Connected closed.");                

            if (pos == buffer.length)
                throw new WebSocketException ("Invalid handshake.");

            buffer[pos] = (byte) b; // THIS LINE CAUSES THE EXCEPTION
            pos += 1;

            if (buffer[pos - 1] == 0x0A && buffer[pos - 2] == 0x0D) {
                String line = new String(buffer, "UTF-8");
                if (line.trim().equals("")) {
                    handshakeComplete = true;
                } else {
                    handshakeLines.add(line.trim());
                }

                buffer = new byte[len];
                pos = 0;
            }
        }

アップデート

より良い実装は次のとおりです。

public void connect() throws WebSocketException {
    try {
        if (connected) {
            throw new WebSocketException("already connected");
        }

        socket = createSocket();
        input = new DataInputStream(socket.getInputStream());
        output = new PrintStream(socket.getOutputStream());

        output.write(handshake.getHandshake());

        boolean handshakeComplete = false;

        ArrayList<String> handshakeLines = new ArrayList<String>();

        BufferedReader reader = new BufferedReader(input);

        String handshakeData;
        while ((handshakeData = reader.readLine()) != null) {
            if (handshakeData.trim().equals("")) {
               handshakeComplete = true;
               break;
            }
            handshakeLines.add(handshakeData);
        }

        if (!handshakeComplete)
            throw new WebSocketException ("Failed to establish handshake.");
于 2012-11-04T02:04:14.243 に答える
1

int read(byte[] b)私はちょうど考えています、あなたのためにバイトを読むものを使わないのはなぜですか。int read(byte[] b) --> Reads some number of bytes from the contained input stream and stores them into the buffer array b.

 while (!handshakeComplete) {
   int bytesRead = input.read(buffer);//returns number of bytes read
   if(bytesRead  < 10000 || bytesRead == -1 ||
      (buffer[bytesRead - 1] == 0x0A && buffer[bytesRead - 2] == 0x0D)){
        //done with reading
        handshakeComplete = true;
   }
   if(bytesRead != -1){
      String line = new String(buffer, "UTF-8");
      if (!line.trim().equals("")) {
         handshakeLines.add(line.trim());
      }
   }
 }
于 2012-11-04T02:39:13.820 に答える
0

ざっと見ただけでは、 の前で止まる保証はありませんbuffer.length == pos。これは、再確認する必要があることの 1 つですpos。バッファーの長さよりも厳密に短くする必要があります。

于 2012-11-04T01:59:51.263 に答える