我遇到kryonet的问题,客户端断开连接。 任何人都可以帮助我解决这个问题的根源吗?
使用kryonet库,为了让客户端保持连接,它需要发送和接收KeepAlive数据包。 客户端线程会自动处理此问题。 但是如果我的客户做了大量工作(注意:在另一个线程中),似乎它会阻止客户端线程这样做。
问题出现在读取大数据库表时需要时间从表中选择一些列(每个Gega的大小)
但尝试尽可能地简化问题 在服务器发送任何内容以启动任务后,在客户端创建一个非常大的List
经过大量的搜索和期待问题的原因;我试试
- 不同的超时阈值
- 不同版本的kryo 2.23和2.20
- 使用TCP和UPD连接(注意:我连接服务器和 客户端)
醇>
这里你是客户代码,如果收到任何对象在另一个线程中执行:
@Override
public void received(Connection connection, Object object) {
if (object instanceof String) {
new Thread() {
@Override
public void run() {
final int RECORD_COUNT = 99999999;
final String RECORD = "Help I am trapped in a fortune cookie factory\n";
List<String> records = new ArrayList<String>(RECORD_COUNT);
for (long i = 0; i < RECORD_COUNT * 4; i++) {
records.add(RECORD);
}
}
}.start();
}
}
客户日志:
在一些KeepAlive消息之后,它提供了两种类型的消息(连接被中止)或(连接超时)
00:24 DEBUG: [kryo] Write: KeepAlive
00:28 DEBUG: [kryo] Read: KeepAlive
00:37 DEBUG: [kryo] Write: KeepAlive
00:37 DEBUG: [kryonet] Connection 7 update: An established connection was aborted by the software in your host machine
OR
00:35 DEBUG: [kryo] Read: KeepAlive
00:41 DEBUG: [kryo] Write: KeepAlive
00:50 DEBUG: [kryonet] Connection 8 timed out.
服务器日志:
94:10 DEBUG: [kryo] Write: KeepAlive
94:11 DEBUG: [kryonet] Connection 7 timed out.
94:11 INFO: [kryonet] Connection 7 disconnected.
答案 0 :(得分:0)
我认为你不是在一个单独的线程中启动客户端。
“从r122开始,客户端更新线程被制作成守护程序线程,导致子进程在完成初始化后立即关闭。”,解决方案是“也许你可以使用它?新线程(客户端).start( );”
所以你应该代替
client.start();
你应该使用
new Thread(client).start();