2015-10-04 2 views
1

Я запускаю приложение через среду видеоигр (Unity, которая является в основном библиотекой C#) на моем устройстве Android. Я бы хотел, чтобы это приложение отвечало на команды с моего ПК (желательно с Windows 8, но может быть Linux: Ubuntu, если проще). Устройство и ПК находятся в одной локальной сети, но не подключены физическим кабелем. Мне нужно, чтобы устройство реагировало на команды с ПК в течение 0,5 секунд после выдачи команды.Подключить приложение Android к ПК через локальную сеть

Вопрос: что является самым простым (концептуальным и практически) способом установления такой связи между моим ПК и моим устройством?

Пример сценария: Я запускаю игру на своем телефоне Android, где пауки сканируют на моем экране. Когда я попадаю в космос на своем компьютере, я хочу, чтобы все пауки были удалены.

Текущее решение: создать сайт ruby-on-rails & база данных. Когда на ПК вводится команда, база данных обновляется командой. Каждые 0,5 секунды устройство проверяет метку времени в базе данных и вытягивает любые новые команды. Это решение является неоптимальным, потому что я не знаю рубина (я готов его изучить, но я хотел бы получить более легкое решение).

Должен ли я использовать разъемы C# для этого?

Мне бы очень понравился простой код, который, например, откроет прямое соединение между моим ПК и моим устройством, что позволит мне отправлять потоки байтов (например, мой компьютер мог отправить строку «пробел был нажат») ,

Я очень необразован относительно сетей и оценил бы простые объяснения.

ответ

2

Лучший способ связи с ПК и мобильным телефоном - простой сокет. Создайте серверный сокет с одной стороны на определенном номере порта и подключите его с другой стороны. Это очень быстро (даже менее 0,1 секунды)

Пример:

Сервер (в мобильной стороне)

public class Provider{ 
    ServerSocket providerSocket; 
    Socket connection = null; 
    ObjectOutputStream out; 
    ObjectInputStream in; 
    String message; 
    Provider(){} 
    void run() 
    { 
     try{ 
      //1. creating a server socket 
      providerSocket = new ServerSocket(2004, 10); 
      //2. Wait for connection 
      System.out.println("Waiting for connection"); 
      connection = providerSocket.accept(); 
      System.out.println("Connection received from " + connection.getInetAddress().getHostName()); 
      //3. get Input and Output streams 
      out = new ObjectOutputStream(connection.getOutputStream()); 
      out.flush(); 
      in = new ObjectInputStream(connection.getInputStream()); 
      sendMessage("Connection successful"); 
      //4. The two parts communicate via the input and output streams 
      do{ 
       try{ 
        message = (String)in.readObject(); 
        System.out.println("client>" + message); 
        if (message.equals("bye")) 
         sendMessage("bye"); 
       } 
       catch(ClassNotFoundException classnot){ 
        System.err.println("Data received in unknown format"); 
       } 
      }while(!message.equals("bye")); 
     } 
     catch(IOException ioException){ 
      ioException.printStackTrace(); 
     } 
     finally{ 
      //4: Closing connection 
      try{ 
       in.close(); 
       out.close(); 
       providerSocket.close(); 
      } 
      catch(IOException ioException){ 
       ioException.printStackTrace(); 
      } 
     } 
    } 
    void sendMessage(String msg) 
    { 
     try{ 
      out.writeObject(msg); 
      out.flush(); 
      System.out.println("server>" + msg); 
     } 
     catch(IOException ioException){ 
      ioException.printStackTrace(); 
     } 
    } 
    public static void main(String args[]) 
    { 
     Provider server = new Provider(); 
     while(true){ 
      server.run(); 
     } 
    } 
} 

и на стороне клиента (ПК - C#)

class ClientThread implements Runnable 
{ 
    public void run() 
    { 
     try 
     { 
      Socket socket = new Socket(serverIpAddress, serverPort); 
      socket.setSoTimeout(5000); 

      while (true) 
      { 
       try 
       { 
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
        Log.d("Nicklas", "Out it goes"); 
        out.println(Command); 

        if (Command == "CMD:GetOptions<EOF>") 
        { 
         Log.d("Nicklas", "Getting options"); 
         try 
         { 
          Log.d("Nicklas", "Line 1"); 
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
          Log.d("Nicklas", "Line 2"); 
          String answer = in.readLine(); 
          Log.d("Nicklas", "answer = " + answer); 
         } 
         catch (Exception ee) 
         { 
          Log.d("Nicklasasasas", ee.toString()); 
         } 
        } 
        break; 

       } 

       catch (Exception e) 
       { 
        Log.d("Nicklas", "CAE = " + e.toString()); 
        break; 

       } 
      } 
      socket.close(); 
     } 
     catch (ConnectException ee) 
     { 
      Log.d("Nicklas", "Kunne ikke forbinde"); 

     } 
     catch (Exception e) 
     { 
      Log.d("Nicklasssssss", e.toString()); 
     } 
    } 
} 

Пример кода, скопированного из этого SO, и этого SO потоков.