使用套接字写入网络设备的问题

时间:2017-01-12 02:13:30

标签: android sockets io

我有一台无线设备通过连接到我网络的端口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客户端进行测试,服务器正在阅读&#39; r&#39;命令如预期的那样。它使用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");

2 个答案:

答案 0 :(得分:0)

将编码类型更改为&#34; US-ASCII&#34;并添加一个回车而不是一个新的线路。我能够按预期读写数据。

答案 1 :(得分:-1)

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

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