安卓如何打开小于1024端口号的Socket

因工作需要,必须要打开小于1024端口号的Socket,请教大家如何实现,多谢各位!
程序中已添加获取最高权限的代码:

try
{
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(command + "\n");
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e)
{
Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
return false;
} finally
{
try
{
if (os != null)
{
os.close();
}
process.destroy();
} catch (Exception e)
{
}
}
但程序仍然报错 java.net.BindException:Permission denied

Android底层使用Linux实现,linux中规定,0-1024称之为特权端口,只有root用户才能够绑定,如果要绑定这个范围的端口号,可以有两种选择:

    切换到root用户运行该程序(简单,但有风险)

    改变程序的属主为root,然后添加用户设置位(set-user-bit),程序中绑定端口之后,马上使用seteuid()类似的函数改变有效身份为普通用户。

    chown -R root:root app

    chmod 4755 app

    在程序中bind完毕,马上调用seteuid()切换到普通用户,但是seteuid是C函数,java的我就不清楚了。

追问

能否提供些具体的方案,在Android中如何实现?

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-23

打开小于1024端口的Socket代码如下:

Socket socket=new Socket("ip",1000); 注: ip为真实IP地址,端口为1000。


网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。


Server端Listen某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。


一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

    创建Socket;

    打开连接到Socket的输入/出流;

    按照一定的协议对Socket进行读/写操作;

    关闭Socket;

相似回答