关于服务端ServerSocket及客户端Socket

在与车机硬件通过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()
    )
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值