socketio / socket.io-client-java

Full-featured Socket.IO Client Library for Java, which is compatible with Socket.IO v1.0 and later.
https://socketio.github.io/socket.io-client-java/installation.html
Other
5.31k stars 969 forks source link

socket.io client sometimes sends arrays wrong #743

Open supermaximus80 opened 1 year ago

supermaximus80 commented 1 year ago

Describe the bug Sometimes socket.io client on android sends array of int[] wront. On server I receive something which looks like this: SELL_COMPANIES_SELECTED: {"sellCIndices":"[I@50bf616","nexEvent":"PROCESS_GAME_FIELD"} As you can see sellCIndices":"[I@50bf616" which is something I can't undertand. Normally received data should look like this SELL_COMPANIES_SELECTED: {"nexEvent":"PROCESS_GAME_FIELD","sellCIndices":[0]}

To Reproduce

Socket.IO server version: 4.6.1

Server

socket.on('SELL_COMPANIES_SELECTED', function(data) {
        console.log("SELL_COMPANIES_SELECTED: %s", JSON.stringify(data));
        console.log("sellCIndices: " + data.sellCIndices);
        console.log("nexEvent: %s", data.nexEvent);
        socket.to(roomId).emit('SELL_COMPANIES_SELECTED', data);
});
  // ...

Socket.IO java client version: 2.1.0

Client

int[] sellCIndices = objsToIndices(currentPlayer.getOwnedProperty(), sellingCompanies);
JSONObject obj = new JSONObject();
try {
    obj.put("sellCIndices", sellCIndices);
    obj.put("nexEvent", nextEvent);
 } catch (JSONException e) {
    Gdx.app.error(STAG, e.toString());
}
socket.emit(event.toString(), obj);
Gdx.app.debug(STAG, String.format("sending SELL_COMPANIES_SELECTED: %s, next event = %s", Arrays.toString(sellCIndices), nextEvent));

Expected behavior On my server I expect to see something like "sellCIndices":[0]. But, sometimes I see strange data like "sellCIndices":"[I@50bf616"

Platform:

Additional context This bug breaks all my application logic, it's very important to fix it or to find a workaround.

shahabrar7746 commented 8 months ago

looks like you are sending hash value of your 'sellCIndices' array. instead you can send content of your array using "Arrays.toString()" method. just replace " obj.put("sellCIndices", sellCIndices); " with " obj.put("sellCIndices", Arrays.toString(sellCIndices)); ". from client code

supermaximus80 commented 8 months ago

@shahabrar7746 Hi. In this case why this happens very seldom and most of the time array sends correctly? An example from the official documentation:

byte[] buffer = "abc".getBytes(StandardCharsets.UTF_8);
JSONObject object = new JSONObject();
object.put("test", "42");

socket.emit("hello", 1, "2", buffer, object);

So my question is, is this the bug? Should we always use Arrays.toString() while sending arrays?

shahabrar7746 commented 7 months ago

its not a bug. its like a feacture of java

supermaximus80 commented 7 months ago

@shahabrar7746 Why this feature sometimes works, sometimes doesn't? It's the bug, but the problem is, is it server parser bug or java client.

darrachequesne commented 7 months ago

The emit arguments are added in a JSONArray here: https://github.com/socketio/socket.io-client-java/blob/ad3a930e346ad54acd8e895b01418f7b936776dd/src/main/java/io/socket/client/Socket.java#L205-L212

Which are then stringified here: https://github.com/socketio/socket.io-client-java/blob/ad3a930e346ad54acd8e895b01418f7b936776dd/src/main/java/io/socket/parser/IOParser.java#L60-L62

It seems that the Java arrays like new int[] { 1, 2, 3 } are sometimes not properly converted to [1,2,3] on some platforms.

As a temporary workaround, I think converting the arrays to a list with Arrays.asList() should fix the issue. Could you please check?

In the meantime, we will try to fix it in the codebase directly.