У меня проблемы при создании розетки в android. Я использую LibGDX.

            @Override
public void create() {
    System.out.println("Enter IP adress.");
    ip = "78.61.65.198";

    System.out.println("Connecting...");
    socket = connection(PORT, ip);

    System.out.println("Setting up InputStream");
    reader = reader(socket);

    System.out.println("Setting up OutputStream");
    output = output(socket);

    while (socket.isConnected()) {
        output.println("0;" + Gdx.input.getAccelerometerX() + ";" + Gdx.input.getAccelerometerY());
    }

}

public static Socket connection(int port, String ip) {
    try {
        return new Socket(InetAddress.getByName(ip), port);
    } catch (UnknownHostException e) {
        e.printStackTrace();
        System.out.println("Unknown host...");
        return null;
    } catch (IOException e) {
        e.printStackTrace();
        System.out.println("Failed to connect...");
        return null;
    }
}

public static BufferedReader reader(Socket socket) {

    try {
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (IOException e) {
        System.err.println("Couldn't get inputStream...");
        e.printStackTrace();
        return null;
    }
}

public static PrintStream output(Socket socket) {
    try {
        return new PrintStream(socket.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Couldn't get outputStream");
        return null;
    }
}

Сервер:

    @Override
public void create() {

    System.out.println("Creating server...");
    server = hostServer(PORT);

    System.out.println("Waiting for Client 1...");
    client1 = waitForConnections(server);

    System.out.println("Setting up input/output for client 1...");
    client1Input = reader(client1);
    client1Output = output(client1);

    setScreen(new gameScreen(this));

}


public static ServerSocket hostServer(int port){
    try {
        return new ServerSocket(port);
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to host server!");
        return null;
    }
}

public static BufferedReader reader(Socket socket){
    try {
        return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to get input stream!");
        return null;
    }
}

public static PrintStream output(Socket socket){
    try {
        return new PrintStream(socket.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to create output stream!");
        return null;
    }
}

public static Socket waitForConnections(ServerSocket server){
    try {
        return server.accept();
    } catch (IOException e) {
        e.printStackTrace();
        System.err.println("Failed to accept connection!");
        return null;
    }
}

Это работает, когда я делаю это с проектом рабочего стола, но когда я делаю это с проектом Android, это не работает.

ОШИБКА: введите описание изображения здесь

Сообщите мне, если у кого-то есть похожие проблемы или нашли решение.

1
Martis 27 Фев 2016 в 18:41

3 ответа

Лучший ответ

Предполагая, что и ваш компьютер, и ваше устройство Android подключены к одной и той же локальной сети (подключены к одному и тому же маршрутизатору), вам следует попытаться использовать внутренний IP-адрес сервера (обычно выглядит так: 10.0.0.X или 192.168.XX), который можно найти, выполнив команду ipconfig в командной строке на ПК с Windows или ifconfig на Linux / MAC. Если ваш компьютер и устройство Android подключены к разным сетям, вам следует использовать внешний IP-адрес сервера, как в вашем примере. В последнем случае вам также следует перенаправить используемый вами порт (1234) на свой компьютер в маршрутизаторе.

1
UnTraDe 28 Фев 2016 в 13:07

Установлено ли клиентское сетевое соединение в потоке / действии пользовательского интерфейса? Если это так, сетевое соединение должно быть установлено в отдельном потоке, например. AsynTask для коротких операций и сервисов для более длительных потоковых операций. http://developer.android.com/training/basics/network -ops / connected.html # AsyncTask.

-1
antrunner 27 Фев 2016 в 17:57

Когда сервер запускается на вашем компьютере, вы не можете подключиться с другого устройства, кроме вашего компьютера, пока вы пытаетесь подключиться к localhost / 127.0.0.1. Только при запуске приложения на вашем компьютере в качестве настольного приложения соединение будет работать, поскольку клиент и сервер находятся на одном хосте. Для других клиентов вам необходимо подключиться к локальному IP-адресу LAN вашего ПК. Когда вы пытаетесь подключиться к localhost / 127.0.0.1 со своего телефона, он ищет сервер, работающий на телефоне, а это не так.

0
TomGrill Games 28 Фев 2016 в 12:50