我在我的Raspberry啓動過程中啓動了一個java程序(這是啓用Raspbian)。 我用/etc/rc.local
文件來做到這一點,它正常工作(我也嘗試/etc/init.d/解決方案,但我更喜歡另一個)。 我直接在控制檯模式下啓動我的raspbian,這樣我可以看到我的程序的輸出。綁定異常只在啓動時啓動[Raspbian]
我的問題是:手動啓動我的應用程序,它效果很好。在啓動時自動啓動,會引發綁定異常:無法分配請求的地址。
啓動程序
在的/etc/rc.local文件,我寫了這條線。它啓動了一個啓動我的.jar程序的腳本。
#! /bin/sh -e
#
# rc.local
#
# [...]
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# \/ Added \/
/home/pi/Documents/DinnerTimePi/startApp
exit 0
我的startApp腳本包含:
#! /bin/sh
cd /home/pi/Documents/DinnerTimePi/
date >> testStart.txt #Only for checking it runs at launch
java -jar DinnerTimeServer.jar
exit 0
正常的程序輸出
Server initialised at : 192.168.1.35 address and : 35150 port.
_ #(Waiting for client to connect)
Java程序的一部分
我的Java程序是一個ServerSocket做一些東西,它的工作原理也適當。
public class TimeServer {
//Instance of class : can have only one server at a time
static private TimeServer instance;
//Default values
static private int port = 35150;
static private String host = "192.168.1.35"; //Adapt for your network, give a fix IP by DHCP
//Variables
private ServerSocket server = null;
protected TimeServer(String pHost, int pPort){ // <- I'm running this constructor with the default values above
list = new LinkedList<ClientProcessor>();
host = pHost; // 192.168.1.135
port = pPort; // 35150
try {
// \/ Line 57 on my code (see stack trace) \/
server = new ServerSocket(port, 10, InetAddress.getByName(host));
} catch (BindException bind){
bind.printStackTrace(); //Here is the problem !!
System.exit(1);
} catch (UnknownHostException hoste) {
hoste.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
正如你所看到的,我使用的IP地址192.168.1.35,這是對我的調制解調器靜態,而且效果很好。 我假設在啓動過程中使用了端口,所以我嘗試了不同的端口,如6543和35150.但是它也做了同樣的事情:手動工作,但在自動啓動過程中不工作。
堆棧跟蹤
這就是我在啓動我的Raspberry時看到的輸出。
[...]
[ OK ] Reached target Network is Online.
Starting LSB: Start NTP deamon...
[ OK ] Started LSB: Start NTP deamon.
java.net.BindException: Can't assign requested address
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at server.TimeServer.<init>(TimeServer.java:57)
at server.TimeServer.getInstance(TimeServer.java:32)
at server.Main_Server.main(Main_Server.java:12)
[ OK ] Started /etc/rc.local Compatibility.
Starting Terminate Plymouth Boot Screen...
[...]
我不明白的是爲什麼我的計劃行之有效由我自己啓動它,並在系統啓動它沒有。 有我的程序沒有根需要。
我希望很清楚,如果您需要更多信息,請不要猶豫。
感謝您的幫助!:)
(退房的整個程序,如果需要對github,分支的AutoLaunch)
您正在使用InetAddress.getByName(主機),它需要名稱解析才能正常工作(也許它不在您調用該函數時),但您已經知道IP地址,所以InetAddress.forString(String ipString)會更合適。 – grahamj42
我不知道你在哪裏看到你的方法,根據文檔,它不存在^^「 它的效果很好,即使我同意你的意見,我也不直接給出主機名IP java正在尋找。 – Kapcash