Android. Java. Socket: sendto failed: EBADF (Bad file number)

Рейтинг: 0Ответов: 1Опубликовано: 30.04.2015

Привет! Есть Nexus 5 с Android 5.1 и есть сервер на сокетах: https://gist.github.com/anonymous/5ae47fa60773dc6d023a

В другом потоке работает с клиентами: https://gist.github.com/anonymous/7dffdbd4321c8cba41a3

Так вот, при попытке отправить ответ выбрасывается исключение:

sendto failed: EBADF (Bad file number)

Что самое удивительное - на Windows аналогичный код работает корректно.

Кто-нибудь сталкивался с такой проблемой?

Ответы

▲ 1

Правильный ответ. Оказалось всё просто. Не надо закрывать BufferedReader на 19-ой строке. Исправленный работающий вариант:

public class ServerEcho extends Thread{

    private final String LOG_TAG = "ServerEcho";
    private Socket socket;

    public ServerEcho(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();
        try {
            InputStream inputStream = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String answer = br.readLine();
            Log.d(LOG_TAG, answer);
            os.write(new String("ANSWER+").getBytes()); // <- Здесь выбрасывается исключение sendto failed: EBADF (Bad file number)
            os.flush();
            os.close();
            br.close(); // < ----- Закрываем здесь!
        }catch (Exception e){
            Log.e(LOG_TAG, "#1: "+e.getMessage());
        }
    }
}

https://gist.github.com/anonymous/92ee967ce9030adb061a