You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin安卓应用无法接收C# UDP回显服务器响应,求可行方案

问题排查与可行实现变体

你的代码中socket.receive(packet)无响应,大概率是网络阻塞、线程策略或UDP配置问题,以下是几个可行的实现调整方案:

变体1:移至后台线程执行网络操作(安卓规范要求)

安卓主线程禁止阻塞式网络IO,即使你用StrictMode放开限制,也可能导致线程挂起或系统隐性限制。将UDP收发逻辑放到后台线程:

// 用Coroutine在后台执行
CoroutineScope(Dispatchers.IO).launch {
    try {
        val buffer = ByteArray(2048)
        DatagramSocket().use { socket ->
            // 非广播场景关闭广播模式
            socket.broadcast = false
            // 设置超时,避免无限阻塞
            socket.soTimeout = 5000

            val sendData = messageStr.toByteArray()
            val sendPacket = DatagramPacket(
                sendData, sendData.size,
                InetAddress.getByName(Settings.RemoteHost), Settings.RemotePort
            )
            socket.send(sendPacket)

            val receivePacket = DatagramPacket(buffer, buffer.size)
            socket.receive(receivePacket)
            // 按实际接收长度转换字符串
            val response = String(receivePacket.data, 0, receivePacket.length)
            println("received = $response")
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

变体2:显式绑定客户端端口

如果服务器需要固定客户端端口才能响应,可在创建DatagramSocket时指定本地端口:

// 绑定本地端口(比如8889),确保服务器能精准回发
val socket = DatagramSocket(8889)

注意:本地端口需未被占用,且安卓Manifest需添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

变体3:添加超时与异常捕获

给DatagramSocket设置超时,避免receive无限阻塞,并捕获异常排查问题:

try {
    val socket = DatagramSocket()
    socket.soTimeout = 3000 // 3秒超时
    socket.send(sendPacket)
    
    val receivePacket = DatagramPacket(buffer, buffer.size)
    socket.receive(receivePacket)
    val response = String(receivePacket.data, 0, receivePacket.length)
    println("received = $response")
} catch (e: SocketTimeoutException) {
    println("接收超时,检查服务器是否响应")
} catch (e: IOException) {
    e.printStackTrace()
} finally {
    socket?.close()
}

额外排查点

  • 确认C#服务器是否正确获取客户端的EndPoint并回发:服务器需用UdpClient.Receive(ref remoteEP)获取客户端地址,再用Send回发至该地址
  • 检查网络连通性:确保安卓设备与服务器在同一局域网,或服务器有公网IP且端口开放
  • 关闭防火墙:服务器端防火墙需允许UDP目标端口的入站/出站规则

内容的提问来源于stack exchange,提问作者Dennis V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:10:50