android - 设备间的双向通信

标签 android tcp server network-programming kotlin

因此,当我尝试通过 TCP 与我的两台平板电脑和支持 Wifi 的外部设备进行通信时,我遇到了一个奇怪的问题。

我会尽力描述问题。该系统的工作原理如下(所有通信均通过无线网络进行):

  • 设备平板电脑 A 发送 TCP 通信
  • tablet A(master)显示消息并将消息重复给 tablet B(slave)-这很好用
  • 平板电脑 A平板电脑 B 发送另一条消息(操作 消息),平板电脑 B 接收该消息没有问题
  • 平板电脑 B 执行操作时,它会向平板电脑 A 发送一条操作消息 - 这就是问题所在,消息确实不会即使发送了也不会被消费。如果我转到另一个 activity 并返回到上一个,则消息消耗

运行 Android 6.0.1 的 Lenovo YT3 平板电脑会出现这种情况

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

}

简单服务器

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 依次从 Intent 获取消息并使用接口(interface)将其发送到 activity

我似乎无法理解为什么当消费 activity 重新启动时,slave 的通信只被 master 消费(?)

最佳答案

这是一个套接字问题。现在我有两个线程在两个端口上监听并且通信正常

关于android - 设备间的双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45193160/

相关文章:

java - RecyclerView 尽管存储了它,但仍丢失了复选框状态

email - 使用具有相同域的多个 smtp 服务器?

events - 来自服务器的 grpc 未经请求的消息?

php - MySQL - 连接失败 : No route to host

android - 在用户在上一个 Activity 中输入后更新 Navigation Drawer 中的 TextView

android - 在 CardScrollView 中显示字母指示器

Android:如何将应用程序翻译成不同的语言并在市场上销售?

delphi如何设置tcpserver接收字符串数据

tcp - 了解 SOCKS5 协议(protocol) RFC

Java Socket - 如何在三点之间发送和接收信息?