как читать сокет входного потока в Android - PullRequest
3 голосов
/ 29 декабря 2010
     can anybody tell me how to read socket input stream. Here is my code.

if (!serverIpAddress.equals(""))
        {
            try
            {
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                Log.i("ClientActivity", "Connecting...");
                Socket socket = new Socket(serverAddr, 5777);

                try {
                    Log.i("ClientActivity", "Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                            .getOutputStream())), true);
                    // where you issue the commands
                    out.println("<maplist />");
                    Log.i("ClientActivity", "Sent.");

                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));                     
                    buffer = new StringBuilder();

                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            try 
                            {
                                buffer.append(input.readLine());
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }).start();    
                    this.WriteXMLResponse(buffer.toString());

                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }

В моем коде и в методе run, где я читаю поток ввода, возникает исключение. который говорит java.net.socketException: неверный номер файла.

и если я использую цикл while, мое приложение зависнет. любое предложение будет полезным. спасибо

1 Ответ

7 голосов
/ 29 декабря 2010

Трудно сказать, что происходит, не видя больше вашего кода, но вот мой вывод о том, что здесь происходит (я сделал довольно много сокет-программирования в приложениях для Android):

Вы создаете Socket и оборачиваете входной поток в BufferedReader в главном потоке приложения, а затем создаете новый поток, чтобы дождаться получения ввода в сокете и последующей обработки этого ввода. Однако, когда вы создаете новый поток, этот код начинает выполняться в фоновом режиме, и тем временем метод, в котором все это происходит (метод, в котором вы объявляете Socket и BufferedReader), заканчивается! Когда этот метод завершается, больше нет ссылки на Socket, поэтому он закрывается и собирается сборщиком мусора во время выполнения. К сожалению, ваш фоновый поток не знает, что его сокет был закрыт в это время, поэтому readLine () в итоге выдает исключение, утверждающее, что сокет (fileno, unix-wise) теперь «плохой», так как он был закрыт во время выполнения.

Вы изначально были правы, предполагая, что цикл while может это исправить, и это будет сделано, потому что он не позволит завершить метод, тем самым оставляя Socket открытым, но проблема в том, что весь пользовательский интерфейс зависает, пока ваш приложение ожидает ввода от сокета.

Истинное решение этой проблемы - все обмен данными через сокет в службе, работающей в отдельном потоке от пользовательского интерфейса приложения.

Я приложил все усилия, чтобы объяснить это, но если какие-то части неясны, просто прокомментируйте, и я постараюсь объяснить дальше или оказать вам более конкретную помощь.

...