Android socket 服务端

August 23, 2013

想在Android 上跑一个 socket 服务端。把在java工程里运行起来的代码直接放到android项目里来,开启线程,创建ServerSocket对象,创建对象的时候报错了。

W/System.err( 3998): java.net.SocketException: socket failed: EACCES (Permission denied)
W/System.err( 3998): at libcore.io.IoBridge.socket(IoBridge.java:583)
W/System.err( 3998): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
W/System.err( 3998): at java.net.PlainServerSocketImpl.create(PlainServerSocketImpl.java:38)
W/System.err( 3998): at java.net.ServerSocket.<init>(ServerSocket.java:98)
W/System.err( 3998): at java.net.ServerSocket.<init>(ServerSocket.java:69)
W/System.err( 3998): at com.binkery.http.server.HttpServer.run(HttpServer.java:34)
W/System.err( 3998): at java.lang.Thread.run(Thread.java:864)
W/System.err( 3998): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
W/System.err( 3998): at libcore.io.Posix.socket(Native Method)
W/System.err( 3998): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
W/System.err( 3998): at libcore.io.IoBridge.socket(IoBridge.java:568)
W/System.err( 3998): ... 6 more

缺少权限的问题。
<uses-permission android:name="android.permission.INTERNET" />

加上权限之后,一直出现这个问题,很郁闷。

W/System.err( 4232): java.net.BindException: bind failed: EACCES (Permission denied)
W/System.err( 4232): at libcore.io.IoBridge.bind(IoBridge.java:89)
W/System.err( 4232): at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:150)
W/System.err( 4232): at java.net.ServerSocket.<init>(ServerSocket.java:100)
W/System.err( 4232): at java.net.ServerSocket.<init>(ServerSocket.java:69)
W/System.err( 4232): at com.binkery.http.server.HttpServer.run(HttpServer.java:34)
W/System.err( 4232): at java.lang.Thread.run(Thread.java:864)
W/System.err( 4232): Caused by: libcore.io.ErrnoException: bind failed: EACCES (Permission denied)
W/System.err( 4232): at libcore.io.Posix.bind(Native Method)
W/System.err( 4232): at libcore.io.ForwardingOs.bind(ForwardingOs.java:39)
W/System.err( 4232): at libcore.io.IoBridge.bind(IoBridge.java:87)
W/System.err( 4232): ... 5 more

后来在stackoverflow.com 上找到了答案,百度不给力啊,关键时候还是google,google能search到这些答案,百度很无力啊。
这个是链接:
http://stackoverflow.com/questions/2694797/bindexception-with-internet-permission-requested

原因呢,是端口号不能低于1024,据说是Linux的问题。这个待考证吧。
Either root your phone, modify the firmware, or don't bind to ports lower than 1024. That's a Linux thing more than an Android thing.

我本来打算用80端口的,结果不能用。我用无参的构造器的时候,也没有给我返回一个自动分配的端口。
我觉得这个问题还是有可能通过其他方式解决的。80端口除非被占用了,不然还是能有办法搞到手的。现在只能老习惯,9527占用端口了。
mServer = new ServerSocket(9527);

有个地方搞错了。刚才看了一眼API,无参的ServerSocket() 返回一个未绑定ServerSocket , 使用ServerSocket(0) 才是返回系统自动分配的端口。

不过还没有找到关于1024的问题。

--- EOF ---

评论

  1. 不懂app开发,围观一下

  2. Android开发 Android开发

    我想知道你是怎么实现的。我就是使用ServerSocket创建在Android App上。创建另一个App写客户端去连接 Serversocket ,但是出现了问题,在路由器的同局域网中就 是连接不上这个ServerSocket,不过使用ServerSocket手机创建热点是,用客户端的手机去连接就可以实现。我不知道这是为什么?可以帮帮我吗?

    1. 我的理解是你的 client 和 server 分别是两个不同的 app,跑在两个不同的设备上,能否描述一下你的 client 是怎么获取 server 端的 ip 地址的。另外你可以在路由器上抓包看一下 client 和 server 之间的包。看上去 client 和 server 的程序大体上是正确的,至少你通过创建热点的方式是可以通信成功的。

添加新评论