2012-08-07 61 views
0

Hallo我試圖通過telnet發送固件文件到調制解調器板。 這裏是我的代碼:java通過telnet發送固件

Socket s = null; 
    try { 
       SocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(addr), 23); 
       s = new Socket(); 
       s.connect(socketAddress, 1000); 

     InputStream inputStream = s.getInputStream(); 
     OutputStream outputStream = s.getOutputStream(); 

     outputStream.write((login + "\n") .getBytes()); 

     Thread.sleep(300); 

     outputStream.write((password + "\n") .getBytes()); 

     Thread.sleep(300); 

        outputStream.write(("swupdate" + "\n").getBytes()); 
        Thread.sleep(300);     

         // Open the file that is the first 
     // command line parameter 
     FileInputStream fstream = new FileInputStream(path_frm_vdsl); 
     // Get the object of DataInputStream 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String line; 
     // Read File Line By Line 
     while ((line = br.readLine()) != null) { 
      // Print the content on the console 
      line = br.readLine(); 
      if (line == null) { 
       Thread.sleep(1000); 
      } else { 
       //System.out.println(line); 
       outputStream.write(line.getBytes()); 
       Log.v("---", line.getBytes() + "" + consumeInput(500, inputStream)); 
       //Log.v("Update_Modem","Updated " + consumeInput(500, inputStream)); 
       //outputStream.write(line.getBytes()); 
       Thread.sleep(10); 
      } 
     } 

它只需登錄發送swupdate命令和轉儲固件文件輸出。第一行輸入後,我有java.net.SocketException:破管 而我不能一次讀取所有文件,沒有足夠的內存異常。 (3Mb)

+0

固件的內容是什麼?您正在逐行閱讀,如果內容不是文字,則不適用。另外,自從您執行br.readLine兩次後,您會丟棄所有其他行。 – 2012-08-07 14:39:21

+0

固件是二進制文件。在這種情況下,你知道更好的方法來讀取文件嗎? – Raspizdyay 2012-08-07 14:50:11

回答

0

不知道你的接收端需要固件,普通二進制,十六進制編碼,base64編碼嗎?

無論如何,這裏是你將如何爲純二進制

Socket s = null; 
try { 
    SocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(addr), 23); 
    s = new Socket(); 
    s.connect(socketAddress, 1000); 

    InputStream inputStream = s.getInputStream(); 
    OutputStream outputStream = s.getOutputStream(); 

    outputStream.write((login + "\n").getBytes()); 

    Thread.sleep(300); 

    outputStream.write((password + "\n").getBytes()); 

    Thread.sleep(300); 

    outputStream.write(("swupdate" + "\n").getBytes()); 
    Thread.sleep(300); 

    // Open the file that is the first 
    // command line parameter 
    FileInputStream fstream = new FileInputStream(path_frm_vdsl); 
    byte[] buffer = new byte[1024]; 
    int fillSize; 

    // Read File chunk by chunk 
    while ((fillSize = fstream.read(buffer)) != -1) { 
     outputStream.write(buffer, 0, fillSize); 
    } 
    outputStream.close(); 
} finally { 
    s.close(); 
} 

發送所以,閱讀數據塊文件,直到有沒有更多的數據(read返回-1)和寫塊(讀收益如何實際上讀了很多)。

1

Telnet協議中的行終止符是\ r \ n。

但是,爲什麼要將整個文件讀入內存?爲什麼所有的睡眠?你爲什麼要跳過每一行?什麼是consumeInput()?

只是讀寫字節。

2

你知道telnet使用信道內信令嗎?數據流包含轉義的命令指令。當您打開一個telnet連接時,一整套初始命令來回傳遞,因爲服務器和客戶端確定了其他功能和首選項。

你可能會發現你的字節流已經損壞,如果你只是採取任何你在服務器上打開。您需要遵守telnet協議,例如正確理解您收到的字節流。