2017-07-19 94 views
0

因此,當嘗試通過TCP與我的兩個平板電腦和外部啓用Wifi的設備進行通信時,我遇到了一個奇怪的問題。設備之間的雙向通信

我會盡力描述問題,我可以做到最好。該系統工作如下(所有通信是通過無線網絡進行的):

  • 設備發送TCP通信片劑甲
  • 片劑甲)顯示消息並重復消息到平板B奴隸) - 這工作正常
  • 片劑A發送另一個消息(動作消息)片劑乙,其片劑乙接收沒有問題
  • 片劑乙執行它發送一個動作消息片劑的動作A - 這裏是問題,即使它被髮送,消息也不消耗。如果我移動到另一個activity並返回到先前的消息消耗

這種情況與聯想YT3平板電腦運行Android 6.0.1

SocketListenerService

private var thread: Thread? = null 
private var socketListener: SocketListener? = null 
private var broadcastManager: LocalBroadcastManager? = null 
val listener = object : SimpleServer.ServerReceivedListener { 

    override fun onLineReceived(line: String) { 

     val response = Intent(SOCKET_RESPONSE) 
     response.putExtra(RESPONSE_MESSAGE, line) 

     broadcastManager!!.sendBroadcast(response) 

    } 

} 

private val incomingServer = SimpleServer(listener) 

override fun onCreate() { 

    super.onCreate() 

    broadcastManager = LocalBroadcastManager.getInstance(this) 

} 

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 

    if (intent != null) { 

     socketListener = SocketListener() 
     thread = Thread(socketListener) 
     thread!!.start() 

    } 

    return super.onStartCommand(intent, flags, startId) 

} 

override fun onDestroy() { 

    super.onDestroy() 

    socketListener!!.shutDown() 
    thread!!.interrupt() 
    incomingServer.closeServer() 

} 

override fun onBind(intent: Intent): IBinder? { 

    return null 

} 

private inner class SocketListener : Runnable { 

    @Volatile private var done = false 

    internal fun shutDown() { 

     done = true 

    } 

    override fun run() { 

     while (!done) { 

      incomingServer.serve() 

     } 

    } 

} 

companion object { 

    val SOCKET_RESPONSE = "socket_response" 
    val RESPONSE_MESSAGE = "response_message" 

    val port = 9888 

} 

SimpleServer

interface ServerReceivedListener { 

    fun onLineReceived(line: String) 

} 

private var server: ServerSocket? = null 
private var client: Socket? = null 
private var listener: ServerReceivedListener? = null 

init { 

    try { 

     server = ServerSocket(SocketListenerService.port) 
     this.listener = listener 

    } catch (err: Exception) { 

     err.printStackTrace() 

    } 

} 

fun serve() { 

    var line: String? 

    try { 

     if (!server!!.isClosed) { 

      client = server?.accept() 

      val r = BufferedReader(InputStreamReader(client!!.getInputStream(), "UTF-8")) 
      line = r.readLine() 

      while (line != null) { 

       if (line.length >= 4) 
        listener!!.onLineReceived(line) 
       else 
        listener!!.onLineReceived("@") 
       line = r.readLine() 

      } 

     } 

    } catch (e: IOException) { 

     if (!e.message!!.contains("Socket closed")) 
      e.printStackTrace() 

    } 

} 

fun closeServer() { 

    try { 

     if (client != null) 
      client!!.close() 
     server!!.close() 

    } catch (e: IOException) { 

     e.printStackTrace() 

    } 

} 

反過來BroadcastBeceiver從意圖獲取消息,並使用一個接口將其發送到activity

我似乎無法理解爲什麼從僅得到由時consumet通信消耗activity重新啓動(?)

回答

0

這是一個套接字問題。現在我有兩個線程在兩個端口上偵聽,並且通信正常工作