@KartoshkaD

Не могу понять, почему сокет кидает ошибку?

Привет. есть задача: нужно открыть сокет и периодически читать/писать в него сообщения.

Мой взгляд на проблему: нужен поток, в методе Thread#run() которого я открываю сокет и забираю из него InputStream и OutputStream. gist

И все работает славно (на эмуляторе). Но, поскольку, я вызываю метод #sendBytes(byte[]) фактически из MainThread'a, то появилась необходимость перелопатить всё это.

Перелопатить решил с помощью HandlerThread'a: gist

Что изменилось: добавил HandlerThread и теперь все задачи выполняю через него: в #onLooperPrepared инициализирую Handler для текущего Looper'a, кидают туда таск-инициализатор (то же, что было в первом варианте в методе run, но без бесконечного цикла), и потом кидаю таск #tryRead(), который после выполнения кидает сам себя. Запись в сокет происходит тем же образом: кидается таск, который пишет байты в OutputStream.

НО в итоге вот:
E/SocketThread: java.net.SocketException: sendto failed: EBADF (Bad file number)
                    at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:546)
                    at libcore.io.IoBridge.sendto(IoBridge.java:515)
                    at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504)
                    at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37)
                    at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266)
                    at java.io.OutputStream.write(OutputStream.java:82)
                    at com.example.networking.socket.SocketThread.trySend(SocketThread.java:82)
                    at com.example.networking.socket.SocketThread.lambda$sendBytes$0(SocketThread.java:72)
                    at com.example.networking.socket.SocketThread$$Lambda$4.run(Unknown Source)
                    at android.os.Handler.handleCallback(Handler.java:739)
                    at android.os.Handler.dispatchMessage(Handler.java:95)
                    at android.os.Looper.loop(Looper.java:135)
                    at android.os.HandlerThread.run(HandlerThread.java:61)
                 Caused by: android.system.ErrnoException: sendto failed: EBADF (Bad file number)
                    at libcore.io.Posix.sendtoBytes(Native Method)
                    at libcore.io.Posix.sendto(Posix.java:206)
                    at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:278)
                    at libcore.io.IoBridge.sendto(IoBridge.java:513)
                    at java.net.PlainSocketImpl.write(PlainSocketImpl.java:504) 
                    at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:37) 
                    at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:266) 
                    at java.io.OutputStream.write(OutputStream.java:82) 
                    at com.example.networking.socket.SocketThread.trySend(SocketThread.java:82) 
                    at com.example.socket.SocketThread.lambda$sendBytes$0(SocketThread.java:72) 
                    at com.example.networking.socket.SocketThread$$Lambda$4.run(Unknown Source) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.os.HandlerThread.run(HandlerThread.java:61) 


в чем может быть ошибка?

PS. а как узнать, что сокет отключился?
  • Вопрос задан
  • 341 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы