gpt4 book ai didi

java - Kryonet 客户端连接问题 Java

转载 作者:行者123 更新时间:2023-12-01 04:18:15 24 4
gpt4 key购买 nike

我有一个 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

}
}

最佳答案

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

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

我不熟悉 kryonet 客户端,但这样做是有意义的。

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

关于java - Kryonet 客户端连接问题 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19233164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com