Android 如何使用端口502

Android 如何使用端口502,android,tcp,modbus,Android,Tcp,Modbus,我正在尝试开发一个需要modbus/TCP的应用程序。Modbus/TCP的默认端口为502。尝试在端口502上打开连接时出错。我尝试了不同的端口,它们都在工作。我想有什么东西阻塞了502端口,但我想不出来 这是我得到的异常:01-01 00:01:44.309:I/System.out(953):S:Error java.net.BindException:bind失败:EACCES(权限被拒绝) 我有“上网”许可 代码: 导入java.io.BufferedReader; 导入java.io

我正在尝试开发一个需要modbus/TCP的应用程序。Modbus/TCP的默认端口为502。尝试在端口502上打开连接时出错。我尝试了不同的端口,它们都在工作。我想有什么东西阻塞了502端口,但我想不出来

这是我得到的异常:
01-01 00:01:44.309:I/System.out(953):S:Error java.net.BindException:bind失败:EACCES(权限被拒绝)

我有“上网”许可

代码:

导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
公共类TCPServer扩展线程{
公共静态最终int服务器端口=502;
公共布尔运行=true;
公共布尔接收=假;
私人版画作家莫特;
公共TCPServer(){
}
公共无效发送消息(字符串消息){
如果(mOut!=null&&!mOut.checkError()){
mOut.println(信息);
mOut.flush();
}
}
@凌驾
公开募捐{
super.run();
试一试{
while(true){
(跑步时){
ServerSocket ServerSocket=新的ServerSocket(SERVERPORT);
serverSocket.setSoTimeout(500);
套接字tempSckt=新套接字();
布尔值未连接=假;
(!已断开连接并正在运行)时{
试一试{
tempSckt=serverSocket.accept();
断开连接=正确;
}捕获(例外e){
}
}
如果(正在运行){
System.out.println(“已连接”);
最终套接字客户端=tempSckt;
新线程(newrunnable()){
@凌驾
公开募捐{
接收=真;
试一试{
mOut=新的PrintWriter(客户端
.getOutputStream());
BufferedReader in=新的BufferedReader(
新的InputStreamReader(客户端
.getInputStream());
同时(接收){
String message=in.readLine();
如果(消息!=null){
//System.out.println(消息);
字节[]字节=message.getBytes();
StringBuilder二进制文件=新的StringBuilder();
for(字节b:字节){
int val=b;
对于(int i=0;i<8;i++){
binary.append((val&128)==0?0
: 1);

val1024以下的端口受到限制-只有具有root权限的应用程序才能侦听这些端口。当然,您的应用程序没有权限

这是Linux/Unix上的一般规则(Android是基于Linux的)


有关此限制的基本原理,请参阅。

在您回答后,我尝试将我的应用程序作为系统应用程序成功运行。但我仍然无法绑定到端口502.Hm,这是另一种可能性(如果您正在运行KitKat)是因为SELinux策略不允许监听低端口。请参阅如何更改SELinux设置。我在BeagleBone Black上使用Texas Instrument的Jelly Bean 4.2 Android图像。它不是KitKat,但我查找内核文件并找到了一些SELinux文件。我不完全确定这些文件是否与KitKat的SELinux文件相同。我尝试了该应用程序这在您提供的链接中提到。但它不能正常工作,因为它需要KitKat。我不确定如何在BeagleBone中设置SELinux,但您可以尝试(在shell中):
setenforce 0
?我在shell中没有setenforce。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer extends Thread {

    public static final int SERVERPORT = 502;
    public boolean running = true;
    public boolean receiving = false;
    private PrintWriter mOut;

    public TCPServer() {
    }

    public void sendMessage(String message) {
        if (mOut != null && !mOut.checkError()) {
            mOut.println(message);
            mOut.flush();
        }
    }

    @Override
    public void run() {
        super.run();
        try {
            while (true) {
                while (running) {
                    ServerSocket serverSocket = new ServerSocket(SERVERPORT);
                    serverSocket.setSoTimeout(500);
                    Socket tempSckt = new Socket();
                    boolean isConnected = false;
                    while (!isConnected && running) {
                        try {
                            tempSckt = serverSocket.accept();
                            isConnected = true;
                        } catch (Exception e) {

                        }
                    }
                    if (running) {
                        System.out.println("connected");
                        final Socket client = tempSckt;
                        new Thread(new Runnable() {

                            @Override
                            public void run() {
                                receiving = true;
                                try {
                                    mOut = new PrintWriter(client
                                            .getOutputStream());
                                    BufferedReader in = new BufferedReader(
                                            new InputStreamReader(client
                                                    .getInputStream()));
                                    while (receiving) {
                                        String message = in.readLine();
                                        if (message != null) {
                                            // System.out.println(message);
                                            byte[] bytes = message.getBytes();
                                            StringBuilder binary = new StringBuilder();
                                            for (byte b : bytes) {
                                                int val = b;
                                                for (int i = 0; i < 8; i++) {
                                                    binary.append((val & 128) == 0 ? 0
                                                            : 1);
                                                    val <<= 1;
                                                }
                                                binary.append(' ');
                                            }
                                            System.out.println("'" + message
                                                    + "' to binary: " + binary);
                                        } else {
                                            receiving = false;
                                        }
                                    }

                                } catch (Exception e) {
                                    System.out.println("S: Error"
                                            + e.toString());
                                } finally {
                                    try {
                                        client.close();
                                    } catch (Exception e2) {
                                    }
                                }
                            }
                        }).start();
                        isConnected = false;
                    }

                    serverSocket.close();
                }
                Thread.sleep(500);
            }
        } catch (Exception e) {
            System.out.println("S: Error " + e.toString());
        }

    }
}