4

Geoloqiがホストするストリーミング サーバーに socket.io を使用して接続しようとしています。

Gottox socket.io-java-client コードを github から直接取得し、URL を変更する以外は何も変更しませんでしたが、「ハンドシェイク中にエラーが発生しました」というメッセージが表示されます。URL は、Geoloqi のメーカーから入手したとおりに機能するはずです: https://community.geoloqi.com/discussion/19/data-streaming#Item_11 (最初の応答を参照)。

BasicExample.java のコードは次のとおりです。

package basic;
/*
 * socket.io-java-client Test.java
 *
 * Copyright (c) 2012, Enno Boland
 * socket.io-java-client is a implementation of the socket.io protocol in Java.
 * 
 * See LICENSE file for more information
 */
import io.socket.IOAcknowledge;
import io.socket.IOCallback;
import io.socket.SocketIO;
import io.socket.SocketIOException;

import org.json.JSONException;
import org.json.JSONObject;

public class BasicExample implements IOCallback {
    private SocketIO socket;

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            new BasicExample();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public BasicExample() throws Exception {
        socket = new SocketIO();
//      socket.connect("http://localhost:8080/", this);
        socket.connect("https://subscribe.geoloqi.com:443", this);

        // Sends a string to the server.
        socket.send("Hello Server");

        // Sends a JSON object to the server.
        socket.send(new JSONObject().put("key", "value").put("key2",
                "another value"));

        // Emits an event to the server.
        socket.emit("event", "argument1", "argument2", 13.37);
    }

    @Override
    public void onMessage(JSONObject json, IOAcknowledge ack) {
        try {
            System.out.println("Server said:" + json.toString(2));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onMessage(String data, IOAcknowledge ack) {
        System.out.println("Server said: " + data);
    }

    @Override
    public void onError(SocketIOException socketIOException) {
        System.out.println("an Error occured");
        socketIOException.printStackTrace();
    }

    @Override
    public void onDisconnect() {
        System.out.println("Connection terminated.");
    }

    @Override
    public void onConnect() {
        System.out.println("Connection established");
    }

    @Override
    public void on(String event, IOAcknowledge ack, Object... args) {
        System.out.println("Server triggered event '" + event + "'");
    }
}

エラーメッセージは次のとおりです。

an Error occured
io.socket.SocketIOException: Error while handshaking
    at io.socket.IOConnection.handshake(IOConnection.java:322)
    at io.socket.IOConnection.access$7(IOConnection.java:292)
    at io.socket.IOConnection$ConnectThread.run(IOConnection.java:199)
Caused by: java.lang.NullPointerException
    at io.socket.IOConnection.handshake(IOConnection.java:302)
    ... 2 more
May 1, 2013 10:02:49 PM io.socket.IOConnection cleanup
INFO: Cleanup

コードの何が問題になっていますか?

4

2 に答える 2

9

例外が発生しているソース コードIOConnection.java:302( 、内部から)を見ると、NullPointerException次のコード ブロックがあります。

if (connection instanceof HttpsURLConnection) {
    ((HttpsURLConnection) connection)
        .setSSLSocketFactory(sslContext.getSocketFactory());
}

明らかconnectionに非 null でなければなりません。そうでなければ、instanceofテストに合格しません。したがって、sslContextヌルでなければなりません。そのファイル内でsslContext参照される他の場所はsetSslContext()とだけgetSslContext()であるため、唯一の論理的な結論は、SSL 接続を確立する前に呼び出す必要があるということですsetSslContext()SocketIO.setDefaultSSLSocketFactory()も to をIOConnection.setSslContext()呼び出すので、代わりにそれも呼び出すことができます。

これを試して:

SocketIO.setDefaultSSLSocketFactory(SSLContext.getDefault());
socket = new SocketIO();
socket.connect("https://subscribe.geoloqi.com:443", this);
...
于 2013-05-02T04:32:10.533 に答える
0

https://github.com/Gotox/socket.io-java-clientを使用して Java クライアントを作成したときに、同じエラーが発生しました。私のサーバーは 1.X に基づいていて、これは 1.0 のみをサポートしているようです ( https://github.com/Gottox/socket.io-java-client/issues/101 )。代わりにhttps://github.com/socketio/socket.io-client-javaを使用して解決しました。

于 2016-11-15T15:29:16.057 に答える