Android - socket.io посыл данных всем клиентам в виде byte[]

433
05 июня 2017, 22:41

Здравствуйте. Моя проблема в том, что я никак не соображу в чем именно может быть проблема. Я использую это в качестве сервера https://github.com/mrniko/netty-socketio.

server.addEventListener("msg", byte[].class, (SocketIOClient client, byte[] data, AckRequest ackRequest) -> {
    server.getBroadcastOperations().sendEvent("msg", data);
});

Так вот такой код крашит приложение, если подключены 2 и более клиентов.

06-04 13:13:50.683 11602-12701/gcd.bint E/EventThread: Task threw exception
                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'int org.json.JSONArray.length()' on a null object reference
                                                       at gcd.bint.network.socket.client.Socket.toArray(Socket.java:447)
                                                       at gcd.bint.network.socket.client.Socket.onevent(Socket.java:309)
                                                       at gcd.bint.network.socket.client.Socket.onpacket(Socket.java:280)
                                                       at gcd.bint.network.socket.client.Socket.access$100(Socket.java:28)
                                                       at gcd.bint.network.socket.client.Socket$2.lambda$new$1(Socket.java:113)
                                                       at gcd.bint.network.socket.client.Socket$2$$Lambda$2.call(Unknown Source)
                                                       at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                       at gcd.bint.network.socket.client.Manager.ondecoded(Manager.java:413)
                                                       at gcd.bint.network.socket.client.Manager.access$1600(Manager.java:29)
                                                       at gcd.bint.network.socket.client.Manager$7.call(Manager.java:389)
                                                       at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                       at gcd.bint.network.socket.parser.Parser$Decoder.add(Parser.java:169)
                                                       at gcd.bint.network.socket.client.Manager.ondata(Manager.java:409)
                                                       at gcd.bint.network.socket.client.Manager.access$1100(Manager.java:29)
                                                       at gcd.bint.network.socket.client.Manager$2.call(Manager.java:358)
                                                       at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                       at io.socket.engineio.client.Socket.onPacket(Socket.java:511)
                                                       at io.socket.engineio.client.Socket.access$1000(Socket.java:31)
                                                       at io.socket.engineio.client.Socket$5.call(Socket.java:313)
                                                       at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                       at io.socket.engineio.client.Transport.onPacket(Transport.java:134)
                                                       at io.socket.engineio.client.Transport.onData(Transport.java:130)
                                                       at io.socket.engineio.client.transports.WebSocket.access$200(WebSocket.java:24)
                                                       at io.socket.engineio.client.transports.WebSocket$2$3.run(WebSocket.java:112)
                                                       at io.socket.thread.EventThread$2.run(EventThread.java:80)
                                                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                       at java.lang.Thread.run(Thread.java:818)
06-04 13:13:50.688 11602-12701/gcd.bint E/AndroidRuntime: FATAL EXCEPTION: EventThread
                                                      Process: gcd.bint, PID: 11602
                                                      java.lang.NullPointerException: Attempt to invoke virtual method 'int org.json.JSONArray.length()' on a null object reference
                                                          at gcd.bint.network.socket.client.Socket.toArray(Socket.java:447)
                                                          at gcd.bint.network.socket.client.Socket.onevent(Socket.java:309)
                                                          at gcd.bint.network.socket.client.Socket.onpacket(Socket.java:280)
                                                          at gcd.bint.network.socket.client.Socket.access$100(Socket.java:28)
                                                          at gcd.bint.network.socket.client.Socket$2.lambda$new$1(Socket.java:113)
                                                          at gcd.bint.network.socket.client.Socket$2$$Lambda$2.call(Unknown Source)
                                                          at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                          at gcd.bint.network.socket.client.Manager.ondecoded(Manager.java:413)
                                                          at gcd.bint.network.socket.client.Manager.access$1600(Manager.java:29)
                                                          at gcd.bint.network.socket.client.Manager$7.call(Manager.java:389)
                                                          at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                          at gcd.bint.network.socket.parser.Parser$Decoder.add(Parser.java:169)
                                                          at gcd.bint.network.socket.client.Manager.ondata(Manager.java:409)
                                                          at gcd.bint.network.socket.client.Manager.access$1100(Manager.java:29)
                                                          at gcd.bint.network.socket.client.Manager$2.call(Manager.java:358)
                                                          at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                          at io.socket.engineio.client.Socket.onPacket(Socket.java:511)
                                                          at io.socket.engineio.client.Socket.access$1000(Socket.java:31)
                                                          at io.socket.engineio.client.Socket$5.call(Socket.java:313)
                                                          at io.socket.emitter.Emitter.emit(Emitter.java:117)
                                                          at io.socket.engineio.client.Transport.onPacket(Transport.java:134)
                                                          at io.socket.engineio.client.Transport.onData(Transport.java:130)
                                                          at io.socket.engineio.client.transports.WebSocket.access$200(WebSocket.java:24)
                                                          at io.socket.engineio.client.transports.WebSocket$2$3.run(WebSocket.java:112)
                                                          at io.socket.thread.EventThread$2.run(EventThread.java:80)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                          at java.lang.Thread.run(Thread.java:818)`

И сам блок(io.socket:socket.io-client:0.8.3):

private static Object[] toArray(JSONArray array) {
    int length = array.length();
    Object[] data = new Object[length];
    for (int i = 0; i < length; i++) {
        Object v;
        try {
            v = array.get(i);
        } catch (JSONException e) {
            logger.log(Level.WARNING, "An error occured while retrieving data from JSONArray", e);
            v = null;
        }
        data[i] = JSONObject.NULL.equals(v) ? null : v;
    }
    return data;
}

Если же подключен только один клиент, то все работает норм.

Слушаю если что так:

socket.on("msg", args -> {
    Log.d("bytes: " + Arrays.toString((byte[]) args[0]));
});

При ошибке результат: bytes: []

Я понимаю, что ключевое здесь int org.json.JSONArray.length(), но где начало цепочки?

Answer 1

Как и было мне предложено, вариант с foreach:

server.addEventListener("msg", byte[].class, (SocketIOClient client, byte[] data, AckRequest ackRequest) -> {
    for(SocketIOClient socketIOClient:server.getAllClients()){
        socketIOClient.sendEvent("msg", data);
    }
    //server.getBroadcastOperations().sendEvent("msg", data);
});

Видимо в api netty просто пока еще этого не предусмотрели. Будем пробовать...

READ ALSO
Ускорить процесс парсинга

Ускорить процесс парсинга

Как можно изменить код, чтобы скачивание происходило быстрее?

299
Движение видимой области на экране

Движение видимой области на экране

Подскажите пожалуйста, как в android реализовывается движение видимой области на экране, что бы пользователь могут двигать экран влево если...

240