首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接后Kryonet断开连接

连接后Kryonet断开连接
EN

Stack Overflow用户
提问于 2012-11-10 18:02:32
回答 5查看 4.5K关注 0票数 4

我跟踪了这个Youtube教程,介绍了Kryonet的基础知识。

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

指向源代码的链接。服务器和客户端都有相同的数据包类。

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

客户端输出:

代码语言:javascript
复制
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)

Server命令行日志:

代码语言:javascript
复制
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通信的东西吗?

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

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

在user1816380通知之后进行编辑:

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

代码语言:javascript
复制
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.
EN

回答 5

Stack Overflow用户

发布于 2012-11-11 18:04:03

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

您似乎阻止了客户端线程这样做,因为您用无限循环阻止它来处理用户输入(而(True)获取用户输入)。

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

代码语言:javascript
复制
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()。这只有在您使用Debug版本的Kryonet时才有效。最好只使用标准输出函数。

票数 6
EN

Stack Overflow用户

发布于 2015-11-17 20:44:24

我只是有同样的问题,我尝试了所有其他的答案,但他们没有工作。结果,我在TCP端口1941和UDP端口1942上托管了一台服务器,但是我的客户端用TCP端口1941 (忽略UDP端口)连接到服务器。添加这样的UDP端口解决了我的问题:

代码语言:javascript
复制
client.connect(5000, address, 1941, 1942);
票数 2
EN

Stack Overflow用户

发布于 2015-05-15 15:10:40

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

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

比如说,你要像这样启动你的客户

代码语言:javascript
复制
client.start();

相反你应该用

代码语言:javascript
复制
new Thread(client).start();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13324632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档