首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图通过java telnet服务器使用lrzsz使用zmodem发送文件。

试图通过java telnet服务器使用lrzsz使用zmodem发送文件。
EN

Stack Overflow用户
提问于 2015-03-27 14:25:18
回答 2查看 854关注 0票数 0

我试图通过阅读java中的stdio并将其转发到连接客户端的套接字,使用lrzsz通过zmodem发送文件。

代码语言:javascript
复制
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下载是通过损坏来的。结果出错了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 21:36:52

回答我自己的问题。

我需要将正确的字符编码添加到输入和输出流中。

代码语言:javascript
复制
        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的建议,即转义它们。

票数 0
EN

Stack Overflow用户

发布于 2015-03-27 15:38:40

您标记了您的问题" telnet“,但您并没有明确表示您正在使用telnet进行远程连接。

Telnet是,而不是,8位干净。它使用“转义”字符在客户端和服务器之间交换配置信息。您的传输程序可能需要一个原始连接。

您可以尝试在应用程序中实现基本的Telnet支持。就您的目的而言,它可能意味着只是转义和取消转义用于前缀Telnet命令的IAC (0xFF)字符。Telnet接口将这些字节从原始流转换为网络上的双IAC字符,就像字符串中的"\“以获得一个反斜杠。

没有必要在网络接口上使用zmodem --它是为没有内置错误检测/校正的串行线路设计的。scprsync (使用ssh)是您的最佳选择,尽管有时我会使用socket程序(或netcat)创建一个原始侦听端口,并直接连接到该端口以传输文件。

机器1:socket -q -l 12345 <archive.zip

机器2:socket -q machine1 12345 >archive.zip

(命令是从内存中输入的,我的命令不是严格准确的)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29303025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档