尝试通过 java telnet 服务器使用 lrzsz 通过 zmodem 发送文件
Trying to send a file with zmodem using lrzsz via java telnet server
我正在尝试使用 lrzsz 通过读取 java 中的 stdio 并通过 zmodem 发送文件并将其转发到已连接客户端的套接字。
private void sendFiles(ArrayList<String> filenames) {
Process p;
ProcessBuilder pb;
filenames.add(0, "/opt/local/bin/sz");
try {
pb = new ProcessBuilder(filenames);
p = pb.start();
InputStreamReader lrzszin = new InputStreamReader(p.getInputStream());
OutputStreamWriter lrzszout = new OutputStreamWriter(p.getOutputStream());
InputStreamReader telnetin = new InputStreamReader(socket.getInputStream());
OutputStreamWriter telnetout = new OutputStreamWriter(socket.getOutputStream());
while (p.isAlive()) {
if (lrzszin.ready()) {
telnetout.write(lrzszin.read());
telnetout.flush();
}
if (telnetin.ready()) {
lrzszout.write(telnetin.read());
lrzszout.flush();
}
}
} catch (IOException ex) {
}
}
但是 zmodem 下载已损坏。它出错了。
您将问题标记为“telnet”,但没有明确说明您正在使用 telnet 进行远程连接。
Telnet 不是 8 位干净的。它使用“转义”字符在客户端和服务器之间交换配置信息。您的传输程序可能需要原始连接。
您可以尝试在您的应用程序中实现基本 Telnet 支持。出于您的目的,它可能意味着转义和取消转义用于为 Telnet 命令添加前缀的 IAC (0xFF) 字符。 Telnet 接口会将原始流中的这些字节转换为网络上的双 IAC 字符,很像字符串中的“\\”以获得单个反斜杠。
在网络接口上使用 zmodem 毫无意义 -- 它是为没有内置错误的串行线路设计的 detection/correction。 scp
或 rsync
(使用 ssh
)是最好的选择,尽管我有时会使用 socket
程序(或 netcat
)来创建原始监听端口和直接连接到它来传输文件。
机器 1:socket -q -l 12345 <archive.zip
机器 2:socket -q machine1 12345 >archive.zip
(命令是凭记忆输入的,我并不严格准确)
回答我自己的问题...
我需要将正确的字符编码添加到输入和输出流中。
BufferedReader lrzszin = new BufferedReader(new InputStreamReader(p.getInputStream(), "ISO-8859-1"));
BufferedWriter lrzszout = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "ISO-8859-1"));
BufferedReader telnetin = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
BufferedWriter telnetout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "ISO-8859-1"));
虽然 SEXYZ telnet 选项考虑了 IAC 字符,但我不确定 lrzsz 是否(可能不是)所以我也添加了 Brian 关于转义它们的建议。
我正在尝试使用 lrzsz 通过读取 java 中的 stdio 并通过 zmodem 发送文件并将其转发到已连接客户端的套接字。
private void sendFiles(ArrayList<String> filenames) {
Process p;
ProcessBuilder pb;
filenames.add(0, "/opt/local/bin/sz");
try {
pb = new ProcessBuilder(filenames);
p = pb.start();
InputStreamReader lrzszin = new InputStreamReader(p.getInputStream());
OutputStreamWriter lrzszout = new OutputStreamWriter(p.getOutputStream());
InputStreamReader telnetin = new InputStreamReader(socket.getInputStream());
OutputStreamWriter telnetout = new OutputStreamWriter(socket.getOutputStream());
while (p.isAlive()) {
if (lrzszin.ready()) {
telnetout.write(lrzszin.read());
telnetout.flush();
}
if (telnetin.ready()) {
lrzszout.write(telnetin.read());
lrzszout.flush();
}
}
} catch (IOException ex) {
}
}
但是 zmodem 下载已损坏。它出错了。
您将问题标记为“telnet”,但没有明确说明您正在使用 telnet 进行远程连接。
Telnet 不是 8 位干净的。它使用“转义”字符在客户端和服务器之间交换配置信息。您的传输程序可能需要原始连接。
您可以尝试在您的应用程序中实现基本 Telnet 支持。出于您的目的,它可能意味着转义和取消转义用于为 Telnet 命令添加前缀的 IAC (0xFF) 字符。 Telnet 接口会将原始流中的这些字节转换为网络上的双 IAC 字符,很像字符串中的“\\”以获得单个反斜杠。
在网络接口上使用 zmodem 毫无意义 -- 它是为没有内置错误的串行线路设计的 detection/correction。 scp
或 rsync
(使用 ssh
)是最好的选择,尽管我有时会使用 socket
程序(或 netcat
)来创建原始监听端口和直接连接到它来传输文件。
机器 1:socket -q -l 12345 <archive.zip
机器 2:socket -q machine1 12345 >archive.zip
(命令是凭记忆输入的,我并不严格准确)
回答我自己的问题...
我需要将正确的字符编码添加到输入和输出流中。
BufferedReader lrzszin = new BufferedReader(new InputStreamReader(p.getInputStream(), "ISO-8859-1"));
BufferedWriter lrzszout = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "ISO-8859-1"));
BufferedReader telnetin = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
BufferedWriter telnetout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "ISO-8859-1"));
虽然 SEXYZ telnet 选项考虑了 IAC 字符,但我不确定 lrzsz 是否(可能不是)所以我也添加了 Brian 关于转义它们的建议。