Здравствуйте. Моя проблема в том, что я никак не соображу в чем именно может быть проблема. Я использую это в качестве сервера 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()
, но где начало цепочки?
Как и было мне предложено, вариант с 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 просто пока еще этого не предусмотрели. Будем пробовать...
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Подскажите пожалуйста, как в android реализовывается движение видимой области на экране, что бы пользователь могут двигать экран влево если...