2016-02-27 3 views
0

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

  @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; 
    } 
} 

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

ОШИБКА: enter image description here

Позвольте мне знать, если у кого есть проблемы или похож нашел решение.

+0

Ваш скриншот LogCat - предупреждение от приложения, которое не принадлежит вам. Пожалуйста, объясните, ** подробно **, что означает «это не работает». – CommonsWare

+0

Это сбой с этим исключением. Я также добавил разрешение USES-INTERNET в файле манифеста. Нужно ли мне больше разрешений? – Martis

+0

«Сбой с этим исключением» - опять же, эта трассировка стека не отображается в вашем приложении. – CommonsWare

ответ

1

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

+0

Спасибо! Это сработало! – Martis

-1

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

+0

Это не приведет к отключению связи. – EJP

+0

правый, спасибо. Кажется, socket.isConnected() вызывается внутри действия. – antrunner

0

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

Смежные вопросы