已开启网络权限,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
相关产品推荐
相关产品推荐

