连接后Kryonet断开连接

TMi*_*hel 4 java kryo kryonet

我按照这个Youtube教程介绍了Kryonet的基础知识.

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

源代码的链接.服务器和客户端都具有相同的Packet类.

我可以让服务器运行,客户端要求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)
Run Code Online (Sandbox Code Playgroud)

服务器命令行日志:

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.
Run Code Online (Sandbox Code Playgroud)

好像系统关闭了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.
Run Code Online (Sandbox Code Playgroud)

oja*_*ber 6

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

看起来你正在阻止客户端线程执行此操作,因为您使用无限循环来阻止它来处理用户输入(While(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还注意到你使用的是Log.info().这仅适用于使用Kryonet的Debug版本.最好只使用标准输出功能.