首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gottox Socket.IO-java-客户端“握手时出错”空指针异常

Gottox Socket.IO-java-客户端“握手时出错”空指针异常
EN

Stack Overflow用户
提问于 2013-05-02 10:14:47
回答 2查看 4.5K关注 0票数 4

我正在尝试使用socket.io连接到Geoloqi托管的流媒体服务器

我直接从github获取了Gottox socket.io-java-client代码,除了更改url之外,没有做任何修改,但它给了我一条“握手时出错”的消息。url应该和我从Geoloqi的制造者那里得到的一样:https://community.geoloqi.com/discussion/19/data-streaming#Item_11 (见第一个回复)。

下面是来自BasicExample.java的代码

代码语言:javascript
复制
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 + "'");
    }
}

以下是错误消息:

代码语言:javascript
复制
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

代码出了什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 12:32:11

查看异常来自的source code (IOConnection.java:302,来自内部NullPointerException),下面是这段代码:

代码语言:javascript
复制
if (connection instanceof HttpsURLConnection) {
    ((HttpsURLConnection) connection)
        .setSSLSocketFactory(sslContext.getSocketFactory());
}

显然,connection必须是非空的,否则它将无法通过instanceof测试。因此,sslContext必须为空。由于该文件中引用sslContext的其他位置仅在setSslContext()getSslContext()中,因此唯一合乎逻辑的结论是,您必须在建立连接之前调用 SSL 。SocketIO.setDefaultSSLSocketFactory()也会调用IOConnection.setSslContext(),所以你也可以直接调用它。

试试这个:

代码语言:javascript
复制
SocketIO.setDefaultSSLSocketFactory(SSLContext.getDefault());
socket = new SocketIO();
socket.connect("https://subscribe.geoloqi.com:443", this);
...
票数 9
EN

Stack Overflow用户

发布于 2016-11-15 23:29:16

当我使用https://github.com/Gottox/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解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16329310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档