2016-08-09 19 views
4

我在我的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

+0

您正在使用InetAddress.getByName(主機),它需要名稱解析才能正常工作(也許它不在您調用該函數時),但您已經知道IP地址,所以InetAddress.forString(String ipString)會更合適。 – grahamj42

+0

我不知道你在哪裏看到你的方法,根據文檔,它不存在^^「 它的效果很好,即使我同意你的意見,我也不直接給出主機名IP java正在尋找。 – Kapcash

回答

2

扔構造的線成特定的功能:

protected boolean initThis(String pHost, int pPort) { 
    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 !! 
     return false; 
    } catch (UnknownHostException hoste) { 
     hoste.printStackTrace(); 
     return false; // Change this to true if you want it to stop here 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
     return false; // Change to true to stop here 
    } 
    return true; 
} 

現在,在你的構造:

protected TimeServer(String pHost, int pPort) { 
    while(!initThis(pHost, pPort)) 
     Thread.sleep(500); // Wait 0.5 secs before retry 
} 

這將重試很多次,直到它工作。

+0

我無法相信它,我從來沒有想過會是這個問題,因爲它可以完美地手動完成。這個解決方案非常簡單! 非常感謝,你救了我。 – Kapcash

+0

不客氣。很高興這可以幫助你。謝謝你的報告。 – xdevs23