在与车机硬件通过socket与NCM网卡驱动联调(IP及端口已固定)

1.服务端创建及接收发送消息(ByteArray)

1.创建ServerSocket
serverSocket = ServerSocket(
    SERVER_SOCKET_PORT,
    50,
    InetAddress.getByName(SERVER_CLIENT_SOCKET_IP)
)
SERVER_SOCKET_PORT为端口号,SERVER_CLIENT_SOCKET_IP客户端的IP
2.等待客户端连接
clientSocket = serverSocket!!.accept()
clientSocket?.keepAlive = true
if (clientSocket?.isConnected == true) {
    serverCallback?.connectClientStatus(true)
    receiveMsgFromClient(serverCallback)
} else {
    serverCallback?.connectClientStatus(false)
}
3.接收消息
private fun receiveMsgFromClient(serverCallback: ServerCallback?) {
    val inputStream = clientSocket!!.getInputStream()
    val buffer = ByteArray(1024)
    buffer.fill(0)
    while (true) {
        val bytesRead = inputStream.read(buffer)
        if (bytesRead == -1) break
        val receivedData = buffer.copyOfRange(0, bytesRead)
        serverCallback?.receiveMsgFromClient(receivedData)
    }
}
4.发送消息
try {
    if (clientSocket?.isClosed == true) {
        LogUtils.i("MeterSocketBuild", "sendMsgToClient fail socket closed")
        return
    }
    val outputStream = clientSocket!!.getOutputStream()
    outputStream.write(bytes, 0, bytes.size)
    outputStream.flush()
} catch (e: IOException) {
    e.printStackTrace()
}

2.客户端创建及接收发送消息

1.创建socket
socketClient = Socket().apply {
    bind(InetSocketAddress(CLIENT_SOCKET_LOCAL_IP, 0))
    connect(InetSocketAddress(CLIENT_SOCKET_IP, CLIENT_SOCKET_PORT))
    keepAlive = true
}
if (socketClient?.isConnected == true) {
    clientCallback?.connectServerStatus(true)
    receiveMsgFromServer(clientCallback)
} else {
    clientCallback?.connectServerStatus(false)
}
2.接收消息
private fun receiveMsgFromServer(clientCallback: ClientCallback?) {
    val inputStream = socketClient!!.getInputStream()
    val buffer = ByteArray(1024)
    buffer.fill(0)
    while (true) {
        val bytesRead = inputStream.read(buffer)
        if (bytesRead == -1) break
        val receivedData = buffer.copyOfRange(0, bytesRead)
        clientCallback?.receiveMsgFromServer(receivedData)
    }
}
3.发送消息
try {
    if (socketClient?.isClosed == true) {
        LogUtils.i("MeterSocketBuild", "sendMsgToServer fail client closed")
        return@submitTask
    }
    val outputStream = socketClient!!.getOutputStream()
    outputStream.write(bytes)
    outputStream.flush()
} catch (e: Exception) {
    e.printStackTrace()
}

以上全部使用线程池来处理。

private fun createThreadPoolExecutor(): ThreadPoolExecutor {
    return ThreadPoolExecutor(
        10, 15,
        15L, TimeUnit.SECONDS,
        SynchronousQueue()
    )
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐