安卓 - ServerSocket 权限被拒绝

9

我想在我的Android手机和树莓派之间建立一个TCP连接。听起来应该很简单,但事实上却不是这样的吗? 所以我开始使用ServerSocket编写一个简单的服务器。 但它没有工作,所以我将代码简化到以下这段,但仍然无法正常运行:

    try
    {
        String wifiip = wifiIpAddress(this);
        Log.v("SERVER", wifiip);

        ServerSocket serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress(wifiip, 4117));
    }catch (Exception ex)
    {
        ex.printStackTrace();
    }

这段代码位于由Android Studio创建的MainActivity中的onCreate方法中。

我还尝试使用此方法创建ServerSocket,但没有成功。

ServerSocket serverSocket = new ServerSocket(4117);

方法wifiIpAddress来自于这里:https://dev59.com/ymQn5IYBdhLWcg3wkH3U#18638588,已经正常工作。

AndroidManifest.xml

<manifest ...>
<uses-sdk android:targetSdkVersion="21"></uses-sdk>
<uses-permission android:name="ANDROID.PERMISSION.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
...
</manifest>

可能有用的信息:

  • 我在ArchLinux上运行AndroidStudio
  • 我尝试使用一个新的、未经修改的项目
  • 我尝试了不同的端口(大于1024)
  • 我在真实设备(Xperia Z,Android 5.0.2)上运行应用程序
  • 我尝试将ServerSocket运行在另一个线程中

日志记录

    java.net.SocketException: socket failed: EACCES (Permission denied)
W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:632)
W/System.err﹕ at java.net.PlainSocketImpl.create(PlainSocketImpl.java:198)
W/System.err﹕ at java.net.PlainServerSocketImpl.create(PlainServerSocketImpl.java:38)
W/System.err﹕ at java.net.ServerSocket.<init>(ServerSocket.java:64)
W/System.err﹕ at eu.therealskynet.socketstest.MainActivity.onBtSendClicked(MainActivity.java:47)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err﹕ at android.view.View$1.onClick(View.java:4078)
W/System.err﹕ at android.view.View.performClick(View.java:4832)
W/System.err﹕ at android.view.View$PerformClick.run(View.java:19839)
W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:739)
W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err﹕ at android.os.Looper.loop(Looper.java:211)
W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5333)
W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
W/System.err﹕ Caused by: android.system.ErrnoException: socket failed: EACCES (Permission denied)
W/System.err﹕ at libcore.io.Posix.socket(Native Method)
W/System.err﹕ at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:282)
W/System.err﹕ at libcore.io.IoBridge.socket(IoBridge.java:617)
W/System.err﹕ ... 17 more

我甚至不知道“socket failed: EACCES (Permission denied)”是什么意思...

你的应用程序是否具有“INTERNET”权限? - CommonsWare
1
尝试 <uses-permission android:name="android.permission.INTERNET" /> 我认为它是区分大小写的。 - Daniel Bo
谢谢Daniel Bo!这就是问题所在。(Android Studio,你本可以告诉我,真的 :/)你能把它发表为答案,这样我就可以接受了吗? - sknt
代码位于onCreate方法中。这样做是行不通的。这样的代码应该在线程或AsyncTask中执行。 - greenapps
'ServerSocket serverSocket = new ServerSocket(4117);'。好了,不要将它绑定到您的Android服务器的WiFi地址。你为什么要那样做呢? - greenapps
是的,我知道accept()方法会阻塞,但正如我所写的,我试图将代码减少到最小,因为我不知道出了什么问题。绑定到wifi地址只是一个不抱希望的尝试来使其工作。但还是谢谢你的建议。 - sknt
1个回答

7

我自己发布答案。

问题在于这是区分大小写的

ANDROID.PERMISSION.INTERNET

必须按照以下方式编写:

android.permission.INTERNET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接