Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用套接字写入网络设备时出现的问题_Android_Sockets_Io - Fatal编程技术网

Android 使用套接字写入网络设备时出现的问题

Android 使用套接字写入网络设备时出现的问题,android,sockets,io,Android,Sockets,Io,我有一个无线设备通过连接到网络的端口22进行通信。一旦设备启动,它立即开始发送日志数据。一旦向该设备发送命令,它将停止日志记录并做出相应响应。这一切都是可行的,我已经使用telnet客户端对其进行了测试 我的问题是,我似乎无法在我的应用程序中正确发送命令。我正在按计划读取日志数据,但当我向它发送命令时,在本例中是命令“r”,它将继续输出日志数据,而不是该命令应向我显示的内容。这意味着我没有正确地发送命令。这是我的任务代码,该任务向其发送命令并将输出记录在android logcat中: publ

我有一个无线设备通过连接到网络的端口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;
    }
}
和打印命令,以:

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

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

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

将编码类型更改为“US-ASCII”,并添加回车符而不是新行,成功了。我能够按预期读取和写入数据。

我使用了几个telnet客户端,这确实有效。我使用的是windows telnet客户端,它使用的是Velestar的vSSH应用程序。有趣的是,当通过ClockworkMod使用android telnet客户端进行测试时,服务器也没有注册命令。脱离主题…说到android的ssh/telnet客户端,一定要尝试Juice ssh,它是免费的。Android有史以来最好的ssh/telnet客户端回到主题,您是否尝试过对Android telnet客户端发送的内容进行pcaping,并将其与其他telnet客户端进行比较?它可能像行尾或任何telnet设置一样简单……但我现在真的想不出任何东西,除非看到更多的测试结果。请在此发布更新,以防您发现问题所在!我现在不在硬件区,所以要到今晚晚些时候才能进行测试。然而,硬件的开发人员刚刚告诉我,硬件希望命令是ASCII编码的,并且CR终止。因此,我将尝试将PrintWrite初始化更改为PrintWriter writer=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),“ASCII”)),true);并将print命令发送给writer.print(command+“\r”);如果这不起作用,我将pcap一直为我工作的客户。
writer.print(command+"\r");