我有一台无线设备通过连接到我网络的端口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");
答案 0 :(得分:0)
将编码类型更改为&#34; US-ASCII&#34;并添加一个回车而不是一个新的线路。我能够按预期读写数据。
答案 1 :(得分:-1)
根据我对您的问题描述的理解,您有一个telnet服务器,当telnet客户端连接到该服务器时,服务器开始发送客户端日志数据。客户端可以向服务器发送“r”以停止日志流。