не запускается kryonet сервер на android устройстве
Я сейчас занимаюсь разработкой небольшой android игры на движке libGDX и решил сделать мультиплеер в игре. Для реализации этой цели я решил воспользоваться kryonet и написать небольшой сервер. Когда я запускаю приложение на ПК, сервер спокойно запускается, но, когда приложение запускается на android устройстве или на android эмуляторе, сервер не запускается, и приложение не падает. Вот код экрана в котором происходит запуск сервера и реализации клиента и сервера
package com.mygdx.game.Screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.Align;
import com.esotericsoftware.kryonet.Client;
import com.esotericsoftware.kryonet.Server;
import com.mygdx.game.Main;
import com.mygdx.game.Multiplayer.ClientListener;
import com.mygdx.game.Multiplayer.PacketMessage;
import com.mygdx.game.Multiplayer.ServerListener;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import java.io.IOException;
import java.net.InetAddress;
import java.util.List;
public class WaitingScreen implements Screen {
private Main game;
private String map;
private String fighter;
private Server server;
private Stage stage;
private Label label;
private BitmapFont font;
private float WIDTH = Gdx.graphics.getWidth();
private float HEIGHT = Gdx.graphics.getHeight();
public WaitingScreen(String state, String map, String fighter, Main game) throws IOException {
this.game = game;
this.map = map;
this.fighter = fighter;
if (state == "server") {
createServer();
} else if (state == "client") {
createClient();
}
init();
}
private void init() {
font = new BitmapFont(Gdx.files.internal("Font/font.fnt"));
font.getData().setScale(2);
Label.LabelStyle labelStyle = new Label.LabelStyle();
labelStyle.font = font;
label = new Label("Waiting", labelStyle);
label.setAlignment(Align.center);
label.setWidth(WIDTH);
stage = new Stage();
label.setPosition(0, HEIGHT / 2 - label.getHeight() / 2);
stage.addActor(label);
preRender();
}
private void preRender() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.draw();
}
private void createClient() throws IOException {
Client client = new Client();
client.getKryo().register(PacketMessage.class);
client.addListener(new ClientListener(game, fighter, map));
client.start();
boolean connected = false;
int c = 0;
while (!connected) {
if (c == 2) {
noServersFound();
c = 0;
break;
}
List<InetAddress> addressList = client.discoverHosts(54777, 3000);
System.out.println(addressList);
for (int i = 0; i < addressList.size(); i++) {
try {
client.connect(3000, addressList.get(i), Main.tcpPort, Main.udpPort);
connected = true;
break;
} catch (Exception e) {
Gdx.app.log("Exception"," in connecting");
}
}
c++;
}
PacketMessage request = new PacketMessage();
request.text = Main.newPlayerEvent;
client.sendTCP(request);
}
private void noServersFound() {
label.setText("No games were found");
}
private void createServer() throws IOException {
server = new Server();
server.bind(Main.tcpPort, Main.udpPort);
server.getKryo().register(PacketMessage.class);
server.addListener(new ServerListener(game, fighter, map));
server.start();
}
@Override
public void show() {
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
stage.draw();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void hide() {
}
@Override
public void dispose() {
}
}
сервер:
package com.mygdx.game.Multiplayer;
import com.badlogic.gdx.Gdx;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.mygdx.game.Main;
import com.mygdx.game.Screens.PlayScreen;
public class ServerListener extends Listener {
private Main game;
private String fighter;
private String map;
public ServerListener(Main game, String fighter, String map) {
this.game = game;
this.fighter = fighter;
this.map = map;
}
public void received(Connection connection, Object object) {
if (object instanceof PacketMessage) {
PacketMessage message = (PacketMessage) object;
Gdx.app.log("New Message on server: ", message.text);
if (message.text.equals(Main.newPlayerEvent)) {
Gdx.app.log("New screen: ", "PlayScreen");
game.setScreen(new PlayScreen(game, fighter, map));
PacketMessage mapResponse = new PacketMessage();
mapResponse.text = String.format("map: %s", map);
connection.sendTCP(mapResponse);
PacketMessage eventResponse = new PacketMessage();
eventResponse.text = "start_game_event";
connection.sendTCP(eventResponse);
}
}
}
}
и клиент:
package com.mygdx.game.Multiplayer;
import com.badlogic.gdx.Gdx;
import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener;
import com.mygdx.game.Main;
import com.mygdx.game.Screens.PlayScreen;
public class ClientListener extends Listener {
private Main game;
private String fighter;
private String map;
public ClientListener(Main game, String fighter, String map) {
this.game = game;
this.fighter = fighter;
this.map = map;
}
public void received(Connection connection, Object object) {
if (object instanceof PacketMessage) {
PacketMessage message = (PacketMessage) object;
Gdx.app.log("New Message on client: ", message.text);
if (message.text == "start_game_event") {
game.setScreen(new PlayScreen(game, fighter, map));
}
if (message.text.startsWith("map: ")) {
map = message.text.replace("map: ", "");
}
}
}
}