Один сокет между несколькими потоками

280
06 августа 2017, 06:48

Здравствуйте!

Не нашел толковых ответов на эту тему.

На данный момент для взаимодействия с "железякой" используются сокеты. Я создаю сокет(DatagramSocket) на одном мне нужном порту(можно выбирать и случайный), все дальнейшие операции должны производиться именно с этого порта. Таймаут выставлен в 1 секунду. Во все остальные части(другие потоки) я передаю именно этот созданный экземпляр сокета.

Взаимодействую с ними следующими образами:

  1. Периодический опрос(раз в 4 секунды) - этого требует устройство иначе оно выходит из режима "захвата". Использую встроенный механизм Android - Timer;
  2. Когда нужно получить какие-то данные с устройства или передать на него я создаю Thread, с помощью него отправляю запрос и получаю ответ. После того как работа законченна, тред останавливается(не зацикливаю);
  3. Поток который должен крутится постоянно и воспринимать только нужные пакеты данных, остальные игнорировать. Его запускаю и он просто должен крутится(В нем то и вся проблема, до этого обходился без него).

Проблема следующая: при введение пункта 3, приложение перестает работать, как-будто сокет постоянно занят. Пример кода(класс из вышеупомянутого пункта 3):

import android.os.Handler
import android.os.Message
import com.controller.labaratory.controller.App
import com.controller.labaratory.controller.models.Container
import java.net.*
/**
 * Created by ivan on 03/08/17.
 */
class DataPacketThread(val handler: Handler,
                       val socket: DatagramSocket,
                       val addres: InetAddress):Thread() {

    override fun run() {
        super.run()
        while (!socket.isClosed){
            try{
                //socket.soTimeout=0
                var buffer:ByteArray = kotlin.ByteArray(1024)
                val packet = DatagramPacket(buffer, buffer.size)
                socket?.receive(packet)
                val odin:Byte = -1
                if (!(buffer[0] == odin)){
                    if(packet.data[0].toInt() == 4){
                        val responseByteArray:ByteArray = byteArrayOf(1,33,
                                packet.data[2],packet.data[3])
                        val packetResponseAnswer = DatagramPacket(responseByteArray,
                                responseByteArray.size, addres, 1026)
                        socket?.send(packetResponseAnswer)
                        handler?.sendMessage(
                                Message.obtain(
                                        handler,
                                        App.UdpClientHandler.DATA_PACKET_RECEIVE,
                                        HandlerContainer(825, Container(
                                                packet.length,
                                                packet.data))))
                    }
                }
            } catch (e:SocketTimeoutException){
                e.printStackTrace()
            } catch (e:SocketException){
                e.printStackTrace()
            }
        }
    }
    fun end(){
        socket.close()
    }
}
READ ALSO
Получить местоположение [дубликат]

Получить местоположение [дубликат]

На данный вопрос уже ответили:

209
Как из кнопочного телефона с делать камеру [требует правки]

Как из кнопочного телефона с делать камеру [требует правки]

help me пожалуйста я очень долго мучаюсь помогите кто знает

256
Поиск и определение участка кода в котором происходит утечка памяти

Поиск и определение участка кода в котором происходит утечка памяти

Вопрос общего характера - как найти утечку памяти? Есть ли какие нибудь хорошие гайды? Можно на английскомБиблиотеку leack canary не советуйте,...

238
Переход на новую страницу для текстовой игры Android

Переход на новую страницу для текстовой игры Android

Пытаюсь сделать простенькую текстовую игру на андроидПри нажатии любой кнопки экран должен сменяться на новый activity (как я думал), где будет...

346