2013-10-07 104 views
1

我有工作找kryonet客户端/服务器..好居多。客户端保持闲置状态,最终在一段时间后断开连接,但这不是我目前试图解决的问题。目前,服务器和客户端可以建立连接并发送数据来回(前出客户端倍),只要客户端和服务器在同一台计算机上。如果您尝试连接到LAN上的其他计算机,则连接超时并失败。Kryonet客户端连接问题的Java

因此,这里是我的问题(S):

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

  2. 什么是保持客户活着的正确方法? (次要目标,但如果你知道它,那会很棒)

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

服务器:

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 

    } 
} 

回答

0

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

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

我不熟悉kryonet CLI恩,但这样做是有道理的。

一般来说确保您的客户端试图连接到你的服务器运行的主机...

+0

的主机实际上仅仅是在'client.connect使用的字符串(5000,GameClient.host,Network.port);' – Chris

+0

你尝试加入调试输出线要打印的解决您的客户端试图连接到? 'System.out.println(“试图连接到”+ GameClient.host +“:”+ Network.port“);'就在你的'client.connect(...);' –

+0

客户端连接正常并发送数据 – Chris

0

一个可能的原因这样的连接问题,防火墙阻止你Network.port

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

我问,因为我在你的服务器代码dont'see主要功能

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

我用得到运行我的服务器应用程序使用此终端命令

java -jar myserverfile.jar 

你如何获得它在“远程”机器上运行?

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

在我的情况下,我有一个AWS实例中的服务器正在侦听来自我的计算机的游戏客户端测试。