Разъем соединения между локальным сервером ПК и эмулятором Android - PullRequest
0 голосов
/ 16 декабря 2011

У меня проблемы с сокетным подключением ПК (простой сервер написан на Java) и эмулятором Android. Соединение установлено, сервер отправляет данные, но когда я пытаюсь прочитать их на Android, он всегда читает нулевую строку. Вот некоторые части моего кода:

Сервер:

serverSocket = new ServerSocket(8888);
socket = serverSocket.accept();
PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
output.write("Output string");
socket.close();

Клиент:

socket = new Socket("10.0.2.2", 8888);
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = input.readLine();
Log.i(TAG, s);
socket.close();

Я пропустил try-catches и logs для ясности. Согласно логам, соединение установлено, сервер отправляет данные, а клиент получает только нулевые строки. Буду признателен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2011

Это работает для меня ... (Этот код только для записи и чтения данных из сокета для сервера и клиента)

Сервер:

  BufferedOutputStream bos = new BufferedOutputStream(connection.
      getOutputStream());

  /** Instantiate an OutputStreamWriter object with the optional character
   * encoding.
   */
  OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");

  String process = "Calling the Socket Server on "+ host + " port " + port;

  /** Write across the socket connection and flush the buffer */
  osw.write(process);
  osw.flush();

Клиент:

 /** Instantiate a BufferedInputStream object for reading
      /** Instantiate a BufferedInputStream object for reading
       * incoming socket streams.
       */

      BufferedInputStream bis = new BufferedInputStream(connection.
          getInputStream());
      /**Instantiate an InputStreamReader with the optional
       * character encoding.
       */

      InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");

      /**Read the socket's InputStream and append to a StringBuffer */
      int c;
      while ( (c = isr.read()) != 13)
        instr.append( (char) c);

      /** Close the socket connection. */
      connection.close();
      System.out.println(instr);
     }
    catch (IOException f) {
      System.out.println("IOException: " + f);
    }
    catch (Exception g) {
      System.out.println("Exception: " + g);
    }

Надеюсь, это поможет вам ..

2 голосов
/ 16 декабря 2011

привет @yuriy В вашем коде нет ничего плохого, на самом деле вы не пишете полную строку в выходной поток, поэтому выдает ошибку, используйте его, это работает для меня

 serverSocket = new ServerSocket(8888);
    socket = serverSocket.accept();
    PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
   output.println("Output string");
    socket.close();

просто замените output.write на output.println всервер

0 голосов
/ 16 декабря 2011

Эмулятор слушает свои "собственные" порты локальной сети. Вы должны переадресовать порт с локального компьютера на порты эмулятора.

Чтение переадресации порта Android ADB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...