我有一臺無線設備通過連接到我的網絡的端口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;
}
}
我在做什麼錯?爲什麼它沒有註冊命令?
UPDATE:
我用幾個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");
我已經使用了幾個telnet客戶端,這是行不通的。我使用的是windows telnet客戶端,它使用Velestar的vSSH應用程序。有趣的是,當使用ClockworkMod對android telnet客戶端進行測試時,服務器也沒有註冊命令。 – David
偏題...說到Android的ssh/telnet客戶端,絕對試試Juice SSH,它是免費的。對於Android來說,最好的ssh/telnet客戶端。 =)回到主題,試試看看你的Android遠程登錄客戶端發送了什麼,並將它與其他遠程登錄客戶端進行比較?它可能就像線路結束或任何telnet設置一樣簡單......但如果沒有看到更多的測試結果,我現在真的無法想象任何事情。如果您發現問題所在,請在此處更新。 – flintlock
我現在遠離硬件,所以我將無法測試,直到今晚晚些時候。但是,硬件開發人員告訴我,硬件期望該命令是ASCII編碼和CR終止。所以我會嘗試將PrintWrite初始化更改爲PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),「ASCII」)),true);並將打印命令寫入writer.print(command +「\ r」); – David