Android 如何使用端口502
我正在尝试开发一个需要modbus/TCP的应用程序。Modbus/TCP的默认端口为502。尝试在端口502上打开连接时出错。我尝试了不同的端口,它们都在工作。我想有什么东西阻塞了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
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());
}
}
}