SocketIO和Bukkit插件

问题描述

我一直在尝试将Bukkit插件与使用Flask的SocketIO服务器连接。 我一直在使用以下库在Java中实现套接字处理:Lib url

这是我在minecraft控制台中收到的错误

> [14:37:06] [ConnectThread/WARN]: io.socket.socketIOException: Error while handshaking
> [14:37:06] [ConnectThread/WARN]: at io.socket.IOConnection.handshake(IOConnection.java:322)
> [14:37:06] [ConnectThread/WARN]: at io.socket.IOConnection.access$600(IOConnection.java:39)
> [14:37:06] [ConnectThread/WARN]: at io.socket.IOConnection$ConnectThread.run(IOConnection.java:199)
> [14:37:06] [ConnectThread/WARN]: Caused by: java.lang.NumberFormatException: For input string: ""62ba1d77af49437db29d82b540167dba","upgrades""
> [14:37:06] [ConnectThread/WARN]: at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
> [14:37:06] [ConnectThread/WARN]: at java.lang.Long.parseLong(Long.java:578)
> [14:37:06] [ConnectThread/WARN]: at java.lang.Long.parseLong(Long.java:631)
> [14:37:06] [ConnectThread/WARN]: at io.socket.IOConnection.handshake(IOConnection.java:318)
> [14:37:06] [ConnectThread/WARN]: ... 2 more

这是我用于将插件连接到服务器的代码

socketIO=  new SocketIO("http://91.121.83.63:5123");
socketIO.connect(new IOCallback() {
    @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 + "'");
    }
});

我的Flask服务器中的代码

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mySecretKey'
socketio = SocketIO(app,cors_allowed_origins="*")
CORS(app)


endpoint = '/api/v1'


# BACKEND - NIET WIJZIGEN!!
# Deze route wordt gebruikt voor het ophalen van de genres in de keuzelijst
@app.route(endpoint + '/players',methods=['GET'])
def get_elementen():
    if request.method == 'GET':
        s = DataRepository.read_players()
        return jsonify(players=s),200

@socketio.on('connect')
def connection():
    print("A new client connected")

@socketio.on('PlayerJoin')
def connection():
    print("A player joined")
    
@socketio.on('PlayerLeave')
def connection2():
    print("A player left")

# Start app
if __name__ == '__main__':
    socketio.run(app,debug=False,host='0.0.0.0',port='5123')

minecraft插件尝试连接时,我在Flask控制台中获得的输出

A new client connected
172.18.0.2 - - [13/Aug/2020 14:42:41] "GET /socket.io/1/ HTTP/1.1" 200 -

我希望有人可以帮助我解决这个问题。

解决方法

该库无法处理服务器未发送的心跳,并且最终会抛出NumberFormatException