2012-08-07 60 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协议,例如正确理解您收到的字节流。