UDP issues (one-sided communication) for some Android devices

1,087 views
Skip to first unread message

Elviss Kustans

unread,
May 5, 2015, 8:56:08 PM5/5/15
to kryone...@googlegroups.com
Hello!

For me it seems that one of my devices(Android) does not receive any UDP packets but it can send UDP packets when using KryoNet.
Problem happens on Xperia Z Ultra (Android 5.1.1, custom firmware - Resurrection_Remix_LP_v5.4.2).
Problem does not happen on Xperia Z1 Compact (Android 4.4.4, original firmware)

I have tested following:
  • Testing client on other Android device (Z1C) - it works
  • Testing client on Desktop - it works
  • Moving server from LAN to dedicated server (in another country) - no difference in results
  • Testing app with all UDP calls replaced by TCP on affected device and server - it works
  • Changing port numbers - no difference
  • Testing UDP connection using nc on Linux and UDP testing app from Play Store - no problems there ( https://play.google.com/store/apps/details?id=com.jca.udpsendreceive )
  • Android Z Ultra: Placing breakpoint at "Object object = udp.readObject(this);" in com.esotericsoftware.kryonet.Client (line 299) - it is not called
  • Android Z Ultra: Placing breakpoint at "if (udp.readFromAddress() == null) continue;" - it get's called as usual
  • Restarting devices - no changes
  • Change distance between WiFi router and Android device - no visible changes
  • Checking PC network part with Wireshark - all packets are sent with correct address and contents seem to be correct
  • Checking Android network with tcpdump (that captures UDP packets too) - I see almost same sequence as PC, only some packets have shuffled order, so it seems to work as expected. Checked UDP checksums - those are correct too.
  • Packets usually are < 500 bytes (and starting packets shoud be < 200 bytes) so packet size shouldn't be an issue
  • App has following permissions: android.permission.INTERNET, android.permission.ACCESS_NETWORK_STATE, android.permission.CHANGE_WIFI_MULTICAST_STATE
I'm using LibGDX and com.esotericsoftware:kryonet:2.22.0-RC1.

I have searched for a while and haven't yet found solution for my problem. I have seen one similar case of it in http://www.java-gaming.org/topics/kryonet-udp-not-working-when-having-the-server-on-pc-and-the-client-on-android/35662/msg/338174/view.html#msg338174

App uses custom serializer (convert data to ByteBuffer and converts ByteBuffer back to data)

Here is log from Server:

00:00 TRACE: [kryo] Registration required: false
00:00 TRACE: [kryo] Register class ID 15: app.networking.GamePacket (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 16: app.networking.Q3CompatiblePacket (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 17: app.networking.SystemMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 18: app.networking.Notification (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 19: app.networking.ClientConnectRequest (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 20: app.networking.ClientDisconnectRequest (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 21: app.networking.ClientControlCommand (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 22: app.networking.Ping (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 23: app.networking.SetupMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 24: app.networking.SpawnMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 25: app.networking.ChangeMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 26: app.networking.DespawnMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 27: app.networking.Q3Heartbeat (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 28: app.networking.ServerConnectResponse (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 29: app.networking.ServerDisconnectResponse (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 30: app.networking.Pong (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 31: app.networking.Q3Bundle (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
00:00 TRACE: [kryo] Register class ID 32: app.networking.Q3Accept (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
Server: Started KryoNet
00:00 TRACE: [kryonet] Server listener added: app.server.ServerProcess$server$1$$special$$inlined$apply$lambda$1
00:00 TRACE: [kryonet] Server thread started.
00:00 DEBUG: [kryonet] Accepting connections on port: 0.0.0.0/0.0.0.0:13412/TCP
00:00 DEBUG: [kryonet] Accepting connections on port: 0.0.0.0/0.0.0.0:13413/UDP
00:00  INFO: [kryonet] Server opened.
00:37 DEBUG: [kryonet] Port 13412/TCP connected to: /192.168.0.100:55218
00:37 TRACE: [kryonet] Connection listener added: com.esotericsoftware.kryonet.Server$1
00:37 TRACE: [kryo] Write class 10: com.esotericsoftware.kryonet.FrameworkMessage$RegisterTCP
00:37 DEBUG: [kryo] Write: com.esotericsoftware.kryonet.FrameworkMessage$RegisterTCP
00:37 TRACE: [kryo] FieldSerializer.write fields of class: com.esotericsoftware.kryonet.FrameworkMessage$RegisterTCP
00:37 TRACE: [kryo] Object graph complete.
00:37 TRACE: [kryonet] Connection 1 sent TCP: RegisterTCP (6)
00:37 TRACE: [kryo] Read class 11: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
00:37 DEBUG: [kryo] Read: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
00:37 TRACE: [kryo] Object graph complete.
00:37 TRACE: [kryo] Write class 11: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
00:37 DEBUG: [kryo] Write: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
00:37 TRACE: [kryo] FieldSerializer.write fields of class: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
00:37 TRACE: [kryo] Object graph complete.
00:37 TRACE: [kryonet] Connection 1 sent TCP: RegisterUDP (6)
00:37 DEBUG: [kryonet] Port 13413/UDP connected to: /192.168.0.100:59957
00:37  INFO: [kryonet] Connection 1 connected: /192.168.0.100
00:37 TRACE: [kryonet] Connection listener added: app.server.TankClient
00:37 TRACE: [kryo] Write class 23: app.networking.SetupMessage
00:37 DEBUG: [kryo] Write: SetupMessage(frame=373, seed=5391816715853519872)
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent TCP: SetupMessage (22)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=374, packets=[Q3Heartbeat(frame=374)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (23)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=375, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (32)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=376, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (41)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=377, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (50)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=378, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (59)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=379, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (68)
00:37 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:37 DEBUG: [kryo] Write: Q3Bundle(frame=380, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379), Q3Heartbeat(frame=380)])
00:37 TRACE: [kryo] Object graph complete.
00:37 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (77)
00:38 TRACE: [kryo] Read class 19: app.networking.ClientConnectRequest
00:38 DEBUG: [kryo] Read: ClientConnectRequest(clientID=0)
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 received TCP: ClientConnectRequest
00:38 TRACE: [kryo] Read class 21: app.networking.ClientControlCommand
00:38 DEBUG: [kryo] Read: ClientControlCommand(action=false, direction=[0.0:0.0])
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 received UDP: ClientControlCommand
00:38 TRACE: [kryo] Read class 22: app.networking.Ping
00:38 DEBUG: [kryo] Read: Ping(frame=373)
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 received UDP: Ping
00:38 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:38 DEBUG: [kryo] Write: Q3Bundle(frame=381, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379), Q3Heartbeat(frame=380), ServerConnectResponse(clientID=1239914943620260865), SpawnMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=381)])
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (129)
00:38 TRACE: [kryo] Write class 30: app.networking.Pong
00:38 DEBUG: [kryo] Write: Pong(frameReq=373, frameRes=381)
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 sent UDP: Pong (14)
00:38 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:38 DEBUG: [kryo] Write: Q3Bundle(frame=382, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379), Q3Heartbeat(frame=380), ServerConnectResponse(clientID=1239914943620260865), SpawnMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=381), ChangeMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=382)])
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (168)
00:38 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:38 DEBUG: [kryo] Write: Q3Bundle(frame=383, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379), Q3Heartbeat(frame=380), ServerConnectResponse(clientID=1239914943620260865), SpawnMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=381), ChangeMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=382), Q3Heartbeat(frame=383)])
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (177)
00:38 TRACE: [kryo] Write class 31: app.networking.Q3Bundle
00:38 DEBUG: [kryo] Write: Q3Bundle(frame=384, packets=[Q3Heartbeat(frame=374), Q3Heartbeat(frame=375), Q3Heartbeat(frame=376), Q3Heartbeat(frame=377), Q3Heartbeat(frame=378), Q3Heartbeat(frame=379), Q3Heartbeat(frame=380), ServerConnectResponse(clientID=1239914943620260865), SpawnMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=381), ChangeMessage(type=1, id=1239914943620260865, position=[1.5:12.5], direction=[0.0:0.0], bb=null), Q3Heartbeat(frame=382), Q3Heartbeat(frame=383), Q3Heartbeat(frame=384)])
00:38 TRACE: [kryo] Object graph complete.
00:38 DEBUG: [kryonet] Connection 1 sent UDP: Q3Bundle (186)
and so on until client thread get's exception because of buffer overflow (too large packet for serializer).


And from Client:
12321             System.out  I  00:00 TRACE: [kryo] Registration required: false
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 15: app.networking.GamePacket (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 16: app.networking.Q3CompatiblePacket (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 17: app.networking.SystemMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 18: app.networking.Notification (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 19: app.networking.ClientConnectRequest (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 20: app.networking.ClientDisconnectRequest (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 21: app.networking.ClientControlCommand (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 22: app.networking.Ping (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 23: app.networking.SetupMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 24: app.networking.SpawnMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 25: app.networking.ChangeMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 26: app.networking.DespawnMessage (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 27: app.networking.Q3Heartbeat (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 28: app.networking.ServerConnectResponse (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 29: app.networking.ServerDisconnectResponse (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 30: app.networking.Pong (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 31: app.networking.Q3Bundle (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryo] Register class ID 32: app.networking.Q3Accept (app.networking.NetworkingPackage$networkUtils$a61dd589$registerPackets$serializer$1)
12321             System.out  I  00:00 TRACE: [kryonet] Connection listener added: app.TankRemote
12321             System.out  I  00:00 TRACE: [kryonet] Client listener added.
12321             System.out  I  00:00  INFO: Connecting: /192.168.0.102:13412/13413
12321             System.out  I  00:00 TRACE: [kryonet] Client thread started.
12321             System.out  I  00:00 DEBUG: [kryonet] Port 55218/TCP connected to: /192.168.0.102:13412
12321             System.out  I  00:00 TRACE: [kryo] Read class 10: com.esotericsoftware.kryonet.FrameworkMessage$RegisterTCP
12321             System.out  I  00:00 DEBUG: [kryo] Read: com.esotericsoftware.kryonet.FrameworkMessage$RegisterTCP
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 TRACE: [kryonet] Connection 1 received TCP: RegisterTCP
12321             System.out  I  00:00 TRACE: [kryo] Write class 11: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
12321             System.out  I  00:00 DEBUG: [kryo] Write: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
12321             System.out  I  00:00 TRACE: [kryo] FieldSerializer.write fields of class: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 TRACE: [kryo] Read class 11: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
12321             System.out  I  00:00 DEBUG: [kryo] Read: com.esotericsoftware.kryonet.FrameworkMessage$RegisterUDP
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 TRACE: [kryonet] Connection 1 received UDP: RegisterUDP
12321             System.out  I  00:00 DEBUG: [kryonet] Port 59957/UDP connected to: /192.168.0.102:13413
12321             System.out  I  00:00  INFO: [kryonet] Connection 1 connected: /192.168.0.102
12321             System.out  I  00:00 TRACE: [kryo] Read class 23: app.networking.SetupMessage
12321             System.out  I  00:00 DEBUG: [kryo] Read: SetupMessage(frame=373, seed=5391816715853519872)
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 DEBUG: [kryonet] Connection 1 received TCP: SetupMessage
12321             System.out  I  00:00 TRACE: [kryo] Write class 19: app.networking.ClientConnectRequest
12321             System.out  I  00:00 DEBUG: [kryo] Write: ClientConnectRequest(clientID=0)
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 DEBUG: [kryonet] Connection 1 sent TCP: ClientConnectRequest (18)
12321             System.out  I  00:00 TRACE: [kryo] Write class 21: app.networking.ClientControlCommand
12321             System.out  I  00:00 DEBUG: [kryo] Write: ClientControlCommand(action=false, direction=[0.0:0.0])
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 DEBUG: [kryonet] Connection 1 sent UDP: ClientControlCommand (15)
12321             System.out  I  00:00 TRACE: [kryo] Write class 22: app.networking.Ping
12321             System.out  I  00:00 DEBUG: [kryo] Write: Ping(frame=373)
12321             System.out  I  00:00 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:00 DEBUG: [kryonet] Connection 1 sent UDP: Ping (10)
12321             System.out  I  00:08 TRACE: [kryo] Read class 12: com.esotericsoftware.kryonet.FrameworkMessage$KeepAlive
12321             System.out  I  00:08 DEBUG: [kryo] Read: com.esotericsoftware.kryonet.FrameworkMessage$KeepAlive
12321             System.out  I  00:08 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:08 TRACE: [kryonet] Connection 1 received TCP: KeepAlive
12321             System.out  I  00:08 TRACE: [kryo] Write class 12: com.esotericsoftware.kryonet.FrameworkMessage$KeepAlive
12321             System.out  I  00:08 DEBUG: [kryo] Write: com.esotericsoftware.kryonet.FrameworkMessage$KeepAlive
12321             System.out  I  00:08 TRACE: [kryo] FieldSerializer.write fields of class: com.esotericsoftware.kryonet.FrameworkMessage$KeepAlive
12321             System.out  I  00:08 TRACE: [kryo] Object graph complete.
12321             System.out  I  00:08 TRACE: [kryonet] Connection 1 sent TCP: KeepAlive (5)
12321             System.out  I  00:09 TRACE: [kryonet] Unable to update connection: Connection 1
12321             System.out  I  java.net.SocketException: Connection is closed.
12321             System.out  I   at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:109)
12321             System.out  I   at com.esotericsoftware.kryonet.Client.update(Client.java:255)
12321             System.out  I   at com.esotericsoftware.kryonet.Client.run(Client.java:338)
12321             System.out  I   at java.lang.Thread.run(Thread.java:818)
12321             System.out  I  00:09  INFO: [kryonet] Connection 1 disconnected.


Protocol short description (if needed):
  • Client connects to server
  • Server sends SetupMessage (TCP)
  • Server starts sending Q3Bundle "field updates" 10 times per second containing everything Client haven't yet ACKed (UDP)
    • Client ACKs with Q3Accept when bundle is received (UDP)
  • Client can send ClientConnectRequest when it wants to join game (TCP)
  • Client sends ClientControlCommand when it makes move (max once per Q3Bundle/"field update") (UDP)
  • Client can send Ping packet once per Q3Bundle/"field update" (UDP)
    • Server responds with Pong packet (UDP)
From log I see that all TCP and UDP packets that client sent was received by server (Ping, ClientControlCommand), but none of Server's UDP packets was received by client(Q3Bundle, Pong). No problems visible with TCP.

I have no idea where to look at next... Any help on this problem would be greatly appreciated.

Thank You in advance!
Elviss

Nate

unread,
May 5, 2015, 9:04:43 PM5/5/15
to kryone...@googlegroups.com
It sounds like maybe the Android version on the Xperia Z Ultra is broken (sorry). It wouldn't be the first time the Android guys break something crucial.

Your logs show a UDP message is received (RegisterUDP), so that seems to work (at least once). Maybe it's something else?


--
You received this message because you are subscribed to the "kryonet-users" group.
http://groups.google.com/group/kryonet-users
---
You received this message because you are subscribed to the Google Groups "kryonet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kryonet-user...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Elviss Kustans

unread,
May 5, 2015, 9:19:03 PM5/5/15
to kryone...@googlegroups.com

Android version breakage could be one of explainations. After all it's aftermarket firmware (and for me currently only way to have 5.1 Android). Any directions on what to try next to check where exactly problem is hidden? As I mentioned before - device itself do receive packets (as tcpdump captures those).

Elviss


You received this message because you are subscribed to a topic in the Google Groups "kryonet-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/kryonet-users/7l436tftBlo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to kryonet-user...@googlegroups.com.

Nate

unread,
May 5, 2015, 9:44:52 PM5/5/15
to kryone...@googlegroups.com
I see the device sending and receiving in your logs.

You could remove all KryoNet code, simplify the use case to the simplest datagram API, see if it breaks. If so, maybe file the bug somewhere (Android, firmware devs).

Elviss Kustans

unread,
May 6, 2015, 11:54:15 AM5/6/15
to kryone...@googlegroups.com
Hello!

Here my tests and updates for problem (maybe it will be useful for other people too):

My test class. To start it I just call new Test().execute(); in main activity.

public class Test extends AsyncTask<Void, Void, Void>
{
   @Override
   protected Void doInBackground(Void... params)
   {
      try
      {
         Selector selector = Selector.open();
         DatagramChannel channel = selector.provider().openDatagramChannel();
         channel.configureBlocking(false);

         final DatagramSocket socket = channel.socket();
         socket.bind(null);

         final InetSocketAddress peer = new InetSocketAddress("192.168.1.103", 9999);
         socket.connect(peer);

         SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

         for (int i = 0; i < 1000; i++)
         {
            try
            {
               Thread.sleep(100L);
            }
            catch (InterruptedException e) { /*Ignored*/ }

            selector.select(100L);

            if (key.isReadable())
               read(channel);

            write(channel, peer);
         }
      }
      catch (IOException e)
      {
         throw new RuntimeException(e);
      }

      return null;

   }

   void read(DatagramChannel channel) throws IOException
   {
      ByteBuffer readBuffer = ByteBuffer.allocateDirect(512);
      final SocketAddress receive = channel.receive(readBuffer);
      if (receive != null)
      {
         Log.e("TEST", "RECEIVED!!!");
      }
      else
      {
         Log.e("TEST", "NOTHING///");
      }
   }

   void write(DatagramChannel channel, InetSocketAddress peer) throws IOException
   {
      byte[] sendBuf = "!!! ".getBytes();
      ByteBuffer writeBuffer = ByteBuffer.wrap(sendBuf);
      channel.send(writeBuffer,peer);
   }
}

On desktop (Linux) I use command  "nc -l 9999 -u" as server. Pressing Enter is enough to send packet back to client.

Results:
  • Z Ultra 4.4.4 (Original), Z1 Compact, Nokia X: 
    • Starting app starts to send "!!! " to server. 
    • Sending anything from server to client will set SelectionKey isReadable to true
    • Each time data is sent, "RECEIVED!!!" is printed in ADB logcat
  • Z Ultra 5.1.1(Custom):
    • Starting app starts to send "!!! " to server.
    • Sending anything from server to client will set SelectionKey isReadable to true
    • No indications on data read. "RECEIVED!!!" is not printed.
So far it seems like Android-side bug.

Elviss

Nate

unread,
May 6, 2015, 12:14:33 PM5/6/15
to kryone...@googlegroups.com
Good work figuring that out! It's unfortunate, because you can never know what devices your stuff will fail on.

Tom Wojciechowski

unread,
Jun 17, 2015, 1:17:02 PM6/17/15
to kryone...@googlegroups.com
Having the same issue here on Android, on a fair few different devices and android versions. All the misbehaving devices seem to be running 5.0.0 or above though.
(HTC One, 5.0.2)
(Nexus 5, 5.1.1)

It seems like DatagramChannel#receive always returns null on these devices, however DatagramChannel.read seems to be behaving correctly. 

Nate, do you have any advice as to a workaround or debugging tips?  The devices can play other games that use UDP, surely they use DatagramChannels?

Joey Enfield

unread,
Jul 12, 2015, 3:39:08 AM7/12/15
to kryone...@googlegroups.com
Has anyone got any progress or workaround on this? I've just come across the same problem? 

Fausto Napoli

unread,
Jul 13, 2015, 6:51:20 PM7/13/15
to kryone...@googlegroups.com
I'm facing this problem too. TCP works fine, UDP just sends packets but doesn't receive them.

Tested on: OnePlus One, Android 5.0.2

Ressource Humaine

unread,
Sep 2, 2015, 3:02:15 PM9/2/15
to kryonet-users
Same thing here.
With a very simple example I can confirm that on 4.4 everything works fine
but on 5.0 and 5.1 I have the following behaviour:

TCP is received from Client and Server
UDP is only received from Server to Client. 
sendToAllUDP does not work.

I should mention that I've tried it on localhost, client and server were
running in the same app.

I would really appreciate a fix, workaround or any info that could help me correct
this problem.

Ressource Humaine

unread,
Sep 3, 2015, 4:43:23 AM9/3/15
to kryonet-users
I should add to my last comment that I've tried both 2.22-RC1 version and a build from the latest sources

Sandro

unread,
Sep 19, 2015, 10:39:02 AM9/19/15
to kryonet-users
So is there any solution for using UDP on Android > 5.0 ? (Note: I'm using Libgdx and Kroynet2.22.0-RC1)
I searched everywhere now and could not find a working work-around :(
I read something that Android 5.0 be default cant UDP Multicast Packets (it seemed to be coherently for me) so i
tried by allowing the recieving by adding

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
to my AndroidManifest
and adding
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
to my AndroidLauncher.java before starting my core-module.
Its not working either.

Do i need to use TCP in future (what i dont want) or will this be fixed, or
is there already a work-around?

Vadim Zubkov

unread,
Oct 21, 2015, 10:47:37 AM10/21/15
to kryonet-users
Hello! I've patched UdpConnection.class and now UDP works for me on Android 5.1
UdpConnection.class

Slawomir Mazurek

unread,
Oct 21, 2015, 11:38:13 PM10/21/15
to kryone...@googlegroups.com
Source unavailable?

On Wed, Oct 21, 2015 at 4:47 PM, Vadim Zubkov <vadz...@gmail.com> wrote:
Hello! I've patched UdpConnection.class and now UDP works for me on Android 5.1

--
Message has been deleted

Vadim Zubkov

unread,
Oct 22, 2015, 3:13:35 PM10/22/15
to kryonet-users
 In this thread https://code.google.com/p/android/issues/detail?id=49092 i read that datagramchannel.receive() does not work on Android > 5.0
UdpConnection.java
Reply all
Reply to author
Forward
Message has been deleted
0 new messages