0

你好,我试图通过 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: Broken pipe 而且我无法一次读取所有文件,没有足够的内存异常。(3MB)

4

3 回答 3

2

你知道 telnet 使用信道内信令吗?数据流包含转义的命令指令。当您打开一个 telnet 连接时,一整套初始命令来回传递,因为服务器和客户端确定彼此的能力和偏好。

你很可能会发现你的字节流被破坏了,如果你只是拿你在服务器上出现的任何东西。您将需要遵守 telnet 协议,例如正确理解您正在接收的字节流。

于 2012-08-07T21:43:42.670 回答
1

Telnet 协议中的行终止符是\r\n。

但是为什么要将整个文件读入内存呢?为什么所有的睡眠?你为什么要跳过每一行?什么是consumeInput()?

只需读取和写入字节。

于 2012-08-07T21:28:17.887 回答
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();
}

因此,以块的形式读取文件,直到没有更多数据(读取返回 -1)并写入块(读取返回实际读取了多少)。

于 2012-08-07T22:07:49.237 回答