Четене на данни от сокет в android

Вбесявам се, опитвайки се да прочета данни от сокет. Опитах всичко и всичко, мисля, че кодът ми трябва да работи, но не успя.

Моето намерение е да стартирам само следния метод на onCreate. Първо създавам нишка, за да изпълнявам всички неща, които са свързани с мрежата. След това създавам обекта scoket и чета входния поток на сокета. В този момент, в безкраен цикъл, прочетох входния поток с помощта на readLine, както беше обяснено в този отговор. Накрая правя каквото искам с данните, които идват от сокета.

Не знам колко данни ще бъдат изпратени от сървъра. И ще бъде в json, но това няма значение.

Ето моя код

public void receiveMsgs(){      
    new Thread(new Runnable(){
        @Override
        public void run() {
            BufferedReader in = null;
            try {
                Log.d("NETWORK-RECEIVE", "Trying to connect to socket...");
                Socket socket;
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                if(socket.isConnected()){
                    Log.d("NETWORK-RECEIVE", "The connection have been stablished");
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.d("NETWORK-RECEIVE", "Something goes wrong: IOException");
            }
            while(true){
                String msg = null;
                try {
                    StringBuilder total = new StringBuilder();
                    String line;
                    while ((line = in.readLine()) != null) {
                        total.append(line);
                    }                   
                    msg = total.toString();
                    Log.d("NETWORK-RECEIVE","Message readed!:"+msg);
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.d("NETWORK-RECEIVE", "Something goes wrong: IOException");
                }
                if(msg == null){
                    Log.d("NETWORK-RECEIVE", "Message is null");
                    break;
                }
                else{
                    //Do what I want
                    Log.d("NETWORK-RECEIVE", "something");
                }
            }           
        }
    }).start();
}

person Gabriel Esteban    schedule 06.12.2013    source източник
comment
пробваш ли го на емулатор или устройство..? Ако искате данни от сървъра, защо не използвате httpclient?   -  person Piyush    schedule 07.12.2013
comment
И двете, защото работим с наш собствен протокол, използвайки потоци, и трябва да публикувам неща чрез потоци   -  person Gabriel Esteban    schedule 07.12.2013
comment
Е, какво се случва, когато го стартирате? Какви регистрационни съобщения генерирате? Имате ли основание да смятате, че връзката със сървъра дори се установява?   -  person Chris Stratton    schedule 07.12.2013
comment
Не се показва грешка в logcat, така че трябва да смятам, че връзките със сокета работят, също така, в друг метод, за изпращане на съобщения, се свързах със сокета, използвайки подобен код.   -  person Gabriel Esteban    schedule 07.12.2013
comment
Не предполагайте – добавете малко постъпково регистриране на успешни резултати към вашия код. И ни кажете какво е действителното наблюдавано поведение. Откъде знаеш, че не работи?   -  person Chris Stratton    schedule 07.12.2013
comment
Добавих някакъв код, който се изпълнява, когато гнездото е свързано, показва се в logcat, така че гнездото работи.   -  person Gabriel Esteban    schedule 07.12.2013
comment
И така, какво не работи? Вие наистина не сте много проактивни, нито относно разследването на проблема, нито относно докладването на информацията, която би била необходима на всеки, който може да ви помогне.   -  person Chris Stratton    schedule 07.12.2013
comment
Вашият isConnected() тест е безсмислен. Ако гнездото не се свърже, щеше да бъде хвърлено изключение, така че тестът щеше да бъде недостъпен. И ако изключението бъде хвърлено, не трябва да попадате в I/O код, който приема, че не е така. Цялата ви обработка на изключения е зле структурирана: например msg == null може да означава, че не са изпратени данни или е възникнало изключение. Смесваш двете условия.   -  person user207421    schedule 09.12.2013


Отговори (1)


Поглеждали ли сте някога OKHttp или Retrofit на square?

http://square.github.io/okhttp/#examples

и

http://square.github.io/retrofit/

Изглежда по-лесно от гнездата. Наистина ли имате нужда от контакти?

person McNinja    schedule 06.12.2013