【问题标题】:Kryonet Client connection issues JavaKryonet 客户端连接问题 Java
【发布时间】:2013-10-14 12:25:44
【问题描述】:

我有一个可以工作的 kryonet 客户端/服务器.. 大部分都很好。客户端保持空闲并最终在一段时间后断开连接,但这不是我目前要解决的问题。目前,只要客户端和服务器在同一台计算机上,服务器和客户端就可以建立连接并来回发送数据(在客户端超时之前)。如果您尝试连接到 LAN 上的另一台计算机,则连接超时并失败。

这是我的问题:

  1. 连接问题的可能原因是什么?

  2. 保持客户端存活的正确方法是什么? (次要目标,但如果你知道,那就太好了)

*我为此使用 LibGDX 和 Kryonet。据我所知,他们不应该有任何冲突。

服务器:

package com.me.mygdxgame;
import java.io.IOException;
import java.util.ArrayList;

import com.badlogic.gdx.math.Vector2;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.esotericsoftware.kryonet.Server;
import com.me.mygdxgame.Network.Obstacles;

public class GameServer {
    Server server;

    public GameServer () throws IOException {
        server = new Server() {
            protected Connection newConnection () {
                return new PlayerConnection();
            }
        };
        Network.register(server);


        //Sends Stuff to Client
        server.addListener(new Listener() {
            public void received (Connection c, Object object) {
                PlayerConnection connection = (PlayerConnection)c;

                if (object instanceof Obstacles) {
                    if (connection.name != null) return;
                    ArrayList<Vector2> obs = ((Obstacles)object).obstacles;
                    if (obs == null) return;
                    System.out.println("Obstacles recieved.");
                    for(int i = 0; i < obs.size(); i++) 
                        System.out.println("Obstacle " + i + "- x: " + obs.get(i).x  );
                    return;
                }
            }
        });


        server.bind(Network.port);
        server.start();

    }

    public void sendAll () { //Send out data
        Obstacles ob = new Obstacles();
        ob.obstacles = new ArrayList<Vector2>();
        for(int i =0; i < Map.obstacles.size(); i++){
            ob.obstacles.add(new Vector2(Map.obstacles.get(i).x,Map.obstacles.get(i).y));
        }
        server.sendToAllTCP(ob);
    }

    static class PlayerConnection extends Connection {
        public String name;
    }
}

客户:

package com.me.mygdxgame;

import java.awt.EventQueue;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import com.badlogic.gdx.ApplicationListener;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.me.mygdxgame.Network.Obstacles;

public class GameClient implements ApplicationListener{
    Client client;
    String name;
    String RefreshHost;
    boolean Connected = false;
    ArrayList<String> hosts = new ArrayList<String>();
    public static String host;

    public GameClient (String host) {
        client = new Client();
        client.start();
        this.host = host;

        Network.register(client);

        client.addListener(new Listener() {
            public void connected (Connection connection) {
                System.out.println("connected");
                Connected = true;
            }

            public void received (Connection connection, Object object) {
                if (object instanceof Obstacles) {
                    Obstacles obs = (Obstacles)object;
                    System.out.println("Obstacle recieved on client - " + obs.obstacles.size());
                    client.sendTCP(obs);
                    System.out.println("Obstacles sent back.");
                    return;
                }else {
                    System.out.println("invalid packet");
                }
            }

            public void disconnected (Connection connection) {
                EventQueue.invokeLater(new Runnable() {
                    public void run () {
                        System.out.println("closed");
                        Connected = false;
                        client.close();
                    }
                });
            }
        });

        new Thread("Connect") {
            public void run () {
                try {
                    client.connect(5000, GameClient.host, Network.port);
                    System.out.println("Connected!");
                    client.setKeepAliveTCP(NORM_PRIORITY);
                    while(Connected) {
                        //System.out.println(client.isIdle());
                    }
                    client.run();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }.start();
    }

    @Override
    public void create() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void render() {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }
}

【问题讨论】:

    标签: java libgdx lan kryonet


    【解决方案1】:

    我建议你在启动客户端之前设置主机

       public GameClient (String host) {
            client = new Client();
            this.host = host;
            client.start();
    

    我对 kryonet Client 不熟悉,但这样做很有意义。

    通常确保您的客户端正在尝试连接到您运行服务器的主机...

    【讨论】:

    • 主机其实只是一个字符串,用在client.connect(5000, GameClient.host, Network.port);
    • 您是否尝试添加调试输出行以打印您的客户端尝试连接的地址? System.out.println("Attempting to connect to " + GameClient.host + ":" + Network.port"); 就在您的 client.connect(...); 之前
    • 客户端连接正常并发送数据
    • "如果您尝试连接到 LAN 上的另一台计算机,则连接超时并失败。" - 你说的比是什么意思?
    • 如果服务器和客户端在我的电脑上,我可以连接。如果它不在我的电脑上,我无法连接
    【解决方案2】:

    导致此类连接问题的一个可能原因是防火墙阻止了您的 Network.port

    另一个,对不起,但我不得不问:服务器应用程序是否在另一台机器上运行?

    我问是因为我在您的服务器代码中没有看到主要功能

    public static void main(String[] args) throws IOException {
            Log.set(Log.LEVEL_DEBUG);
            new GameServer();
        }
    

    我用这个终端命令来运行我的服务器应用程序

    java -jar myserverfile.jar 
    

    如何让它在“远程”机器上运行?

    顺便说一句,我在我的游戏中使用 libgdx 和 kryonet,到目前为止,我还没有遇到一起使用它们的问题。

    在我的例子中,我的 AWS 实例中的服务器正在监听我的计算机上的游戏客户端测试。

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多