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

已开启网络权限,Android单独线程运行HTTP服务器仍遇权限拒绝

问题分析与解决方案

你遇到的java.net.SocketException: Permission denied错误,核心原因是Android系统对特权端口的限制,结合权限配置细节,具体解决如下:

1. 特权端口无法绑定(核心原因)

Android遵循Unix系统的特权端口规则:1024以下的端口(如80、443)需要root权限才能绑定,普通应用没有权限使用这类端口。你代码中指定的port = 80正好触发了这个限制。

2. 修正方案

(1)改用非特权端口

将端口改为1024及以上的数值(比如8080、8090等),这是最直接且推荐的解决方式:

Thread {
    ipAddress?.let { it1 ->
        // 将端口从80改为8080
        embeddedServer(Netty, host = it1, port = 8080) {
            routing {
                get("/") {
                    Log.d("Fragment.kt", "Received request on get path /")
                }

                get("/url1") {
                    Log.d(
                        "Fragment.kt",
                        "Received request on get path /url1"
                    )
                }
            }
        }
    }?.start(wait = true)
}.start()

(2)确认权限配置正确性

虽然你已经添加了INTERNET权限,但需要确保它的位置正确:

  • 权限声明必须放在AndroidManifest.xml的<manifest>根标签下,不能嵌套在<application>标签内:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sampleapp.trainerapp.dev">

    <!-- 正确的权限位置 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        ...>
        ...
    </application>
</manifest>

(3)额外注意事项

  • 确保ipAddress是设备的局域网IP(如192.168.x.x),而非localhost或127.0.0.1,否则其他设备无法访问你的服务器。
  • 如果必须使用80端口,只能通过root设备实现,但这会失去普通应用的兼容性,不推荐。

内容的提问来源于stack exchange,提问作者Henry Zhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:15:05