【问题标题】:Problems writing to network device using sockets使用套接字写入网络设备时出现问题
【发布时间】:2017-05-27 00:29:57
【问题描述】:

我有一个无线设备通过连接到我的网络的端口 22 进行通信。设备启动后,立即开始发送日志数据。一旦向该设备发送命令,它就会停止记录并做出相应的响应。这一切都有效,我已经使用 telnet 客户端对其进行了测试。

我的问题是我似乎无法在我的应用程序中正确地向它发送命令。我正在按计划读取日志数据,但是当我向它发送命令时,在本例中是命令“r”,它会继续输出日志数据,而不是它应该为该特定命令显示的内容。这必须意味着我没有正确发送命令。这是我的任务代码,它向它发送命令并将输出记录在 android logcat 中:

public class ReceiveVarTask extends AsyncTask<Void, Void, Void>{
    String dstAddress;
    int Port;

    ReceiveVarTask(String addr, int port) {
        dstAddress = addr;
        Port = port;
    }

    protected Void doInBackground(Void... vars){
        Socket socket = null;
        String command = "r";

        try {
            Log.i(TAG, "Connecting to port 22");
            socket = new Socket(dstAddress, Port);
            Log.i(TAG, "Connected to port 22");

            PrintWriter writer = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())), true);

            InputStream inputStream = socket.getInputStream();

            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

            writer.println(command);

            String line = reader.readLine();

            Log.i(TAG, line);

            while(line!=null && !isCancelled()){

                line = reader.readLine();
                Log.i(TAG, line);
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    protected void onPostExecute(Void arg) {
        taskRunning = false;
    }
}

我做错了什么?为什么没有注册命令?

更新:

我已经使用了几个 telnet 客户端进行测试,并且服务器正在读取一些预期的“r”命令。它使用 Windows telnet 客户端运行,它使用 Velestar 的 vSSH 应用程序运行。有趣的是,在 ClockworkMod 使用 android telnet 客户端进行测试时,服务器也没有注册该命令。

可能与编码有关吗?

我是否需要任何额外的权限才能使用套接字?我在清单中声明了 android.permission.INTERNET。

更新 2:

硬件的开发人员刚刚告诉我,硬件期望命令是 ASCII 编码并终止 CR。所以我会尝试将 PrintWrite 初始化更改为:

PrintWriter writer = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "ASCII")), true); 

和打印命令:

writer.print(command+"\r");

【问题讨论】:

    标签: android sockets io


    【解决方案1】:

    根据我对您的问题描述的理解,您有一个 telnet 服务器,当 telnet 客户端连接到该服务器时,服务器开始发送客户端日志数据。客户端可以向服务器发送一个“r”来停止日志流。

    • 我建议您首先使用另一个 telnet 客户端确认发送“r”确实会阻止服务器生成更多日志数据。
    • 您可以使用 Wireshark 检查是否确实发送了“r”命令。

    【讨论】:

    • 我使用了几个 telnet 客户端,这确实有效。我使用 Windows telnet 客户端工作,它使用 Velestar 的 vSSH 应用程序工作。有趣的是,在 ClockworkMod 使用 android telnet 客户端进行测试时,服务器也没有注册该命令。
    • 题外话...说到 Android 的 ssh/telnet 客户端,一定要试试 Juice SSH,它是免费的。有史以来最好的 ssh/telnet 客户端,适用于 Android。 =) 回到主题,您是否尝试过 pcaping 您的 Android telnet 客户端发送的内容并将其与其他 telnet 客户端进行比较?它可能就像换行符或任何 telnet 设置一样简单……但如果没有看到更多测试结果,我现在真的想不出任何东西。如果您发现问题所在,请在此处发布更新!
    • 我目前不在硬件方面,所以我要等到今晚晚些时候才能测试。但是,硬件的开发人员刚刚告诉我,硬件期望命令是 ASCII 编码并终止 CR。所以我会尝试将 PrintWrite 初始化更改为 PrintWriter writer = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), "ASCII")), true);和 writer.print(command+"\r"); 的打印命令
    • 如果这不起作用,我将 pcap 为我工作的客户。
    【解决方案2】:

    将编码类型更改为“US-ASCII”并添加回车而不是新行就可以了。我能够按预期读写数据。

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 2016-03-30
      相关资源
      最近更新 更多