Java Kryonet在连接后立即断开连接

Java Kryonet在连接后立即断开连接,java,kryo,kryonet,Java,Kryo,Kryonet,我接着介绍了Kryonet的基本知识 基本上,这是一个Kryonet Hello World,它解释了如何设置一个基本服务器和一个客户端,允许客户端向服务器发送数据包并进行非常基本的通信 链接到。服务器和客户端都具有相同的数据包类 我可以让服务器运行,让客户端请求IP连接。但是,当我进入IP时,客户端在连接后立即终止 客户端输出: 00:03 INFO: Connecting: /127.0.0.1:54555 00:03 INFO: [kryonet] Connection 1 conne

我接着介绍了Kryonet的基本知识

基本上,这是一个Kryonet Hello World,它解释了如何设置一个基本服务器和一个客户端,允许客户端向服务器发送数据包并进行非常基本的通信

链接到。服务器和客户端都具有相同的数据包类

我可以让服务器运行,让客户端请求IP连接。但是,当我进入IP时,客户端在连接后立即终止

客户端输出:

00:03  INFO: Connecting: /127.0.0.1:54555
00:03  INFO: [kryonet] Connection 1 connected: /127.0.0.1
00:03  INFO: [CLIENT] You have connected.
BUILD SUCCESSFUL (total time: 3 seconds)
服务器命令行日志:

00:00  INFO: [kryonet] Server opened.
00:04 DEBUG: [kryonet] Port 54555/TCP connected to: /127.0.0.1:53217
00:04 DEBUG: [kryo] Write: RegisterTCP
00:04  INFO: [kryonet] Connection 1 connected: /127.0.0.1
00:04  INFO: [SERVER] Someone has connected.
00:04 DEBUG: [kryonet] Connection 1 update: Se ha forzado la interrupcion de una
 conexion existente por el host remoto
00:04  INFO: [SERVER] Someone has disconnected.
00:04  INFO: [kryonet] Connection 1 disconnected.
看起来系统关闭了TCP连接,但我真的不知道。我必须在Windows或/和路由器中启用某些东西以允许Kryonet通信吗

有人能发现问题吗?提前谢谢

命令行日志中以西班牙语显示的行类似于“远程主机已强制中断现有连接”

在用户1816380之后编辑建议:

大多数情况下,它仍然显示原始错误,但有时您可以看到:

00:00  INFO: [kryonet] Server opened.
00:07 DEBUG: [kryonet] Port 54555/TCP connected to: /127.0.0.1:50787
00:07 DEBUG: [kryo] Write: RegisterTCP
00:07  INFO: [kryonet] Connection 1 connected: /127.0.0.1
00:07  INFO: [SERVER] Someone has connected.
00:07 DEBUG: [kryo] Read: Packet0LoginRequest
00:07 DEBUG: [kryonet] Connection 1 received TCP: Packet0LoginRequest
00:07 DEBUG: [kryo] Write: Packet1LoginAnswer
00:07 DEBUG: [kryonet] Connection 1 sent TCP: Packet1LoginAnswer (6)
00:07 DEBUG: [kryonet] Connection 1 update: Se ha forzado la interrupcion de una
 conexion existente por el host remoto
00:07  INFO: [SERVER] Someone has disconnected.
00:07  INFO: [kryonet] Connection 1 disconnected.

为了让客户端保持连接,它需要发送和接收KeepAlive数据包。 调用client.start()时;client.connect(); 客户端线程在后台启动,自动为您处理此问题

看起来您正在阻止客户端线程执行此操作,因为您使用无限循环来阻止它以处理用户输入(而(true)获取用户输入)

相反,您应该有一个单独的线程来接受用户输入。 以下是实现客户端接收功能的一种方法(可能不是最好的):

public void received(Connection c, Object o) {
    System.out.println("received something");
    if (o instanceof Packet1LoginAnswer){

        boolean answer = ((Packet1LoginAnswer) o).accepted;

        if (answer) {
          System.out.println("Please enter your message for server");
            new Thread("Get User Input") {
                public void run () {
                    try {

                      if (ChatClient.scanner.hasNext()){
                        Packet2Message mpacket = new Packet2Message();
                        mpacket.message = ChatClient.scanner.nextLine();
                        client.sendTCP(mpacket);
                        System.out.println("Please enter another message");
                      }

                    } catch (Exception ex) {
                        ex.printStackTrace();
                        System.exit(1);
                    }
                }
            }.start();

        } else {
              System.out.println("Answer is false");
          c.close();
        }
    }

    if (o instanceof Packet2Message){
        String message = ((Packet2Message) o).message;
        Log.info(message);
    }
}
我还注意到您正在使用Log.info()。 这仅在您使用Kryonet的调试版本时有效。
最好只使用标准输出函数。

同样的问题和行为可能是由于使用了最新版本的Kryonet2.20。例如,当使用kryonet-2.12时,问题很可能会得到解决


所以试着用kryonet-2.12代替kryonet-2.20,这个例子应该可以用;-)

我不确定这是否相关(因为您与源代码的链接不再有效),但是

如果将服务器配置为TCPUDP,然后让客户端仅通过TCP连接,则可能会出现您描述的问题


如果您希望利用主机发现,但此后只需要TCP连接,则建议您。

我认为您不是在单独的线程中启动客户端

“从r122开始,客户端更新线程被设置为守护进程线程,导致子进程在完成初始化后立即关闭。”,解决方案是“也许您可以使用这个?新线程(client).start();”

比如说,你是这样开始你的客户的

client.start();
相反,你应该使用

new Thread(client).start();

我只是有同样的问题,我尝试了所有其他答案,但都不起作用。 原来我在TCP端口
1941
和UDP端口
1942
但是,我的客户端正在使用TCP端口连接到服务器
1941
(忽略UDP端口)。像这样添加UDP端口为我解决了这个问题:

client.connect(5000, address, 1941, 1942);

感谢user1816380的帮助,但问题仍然存在,请在OP中查找我更新的控制台消息奇怪的是,仍然显示原始错误,但有时略有不同,请查看我的编辑尝试将客户端和服务器上的日志记录改为跟踪,并查看是否接收到保持活动的数据包。Log.set(Log.LEVEL_TRACE);你这样加是什么意思?你不就是这样加上去的吗?第三个参数是tcp端口,第四个参数是udp端口。不一定,您可以不提供udp端口进行连接,也可以不提供udp进行主机连接,显然,您不能使用udp进行主机连接,也不能不使用udp进行连接。哦,我明白了,但是出于某种原因,即使这样做之后,客户端仍保持断开连接,我不知道为什么。