2017-01-12 69 views
0

我有一臺無線設備通過連接到我的網絡的端口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"); 

回答

-1

我從您的問題描述的理解,你有一個telnet服務器,當Telnet客戶端連接到該服務器,服務器開始發送客戶端日誌數據。客戶端可能會向服務器發送一個「r」來停止日誌流。

  • 我建議你先確認使用另一個telnet客戶端,發送「r」確實會停止服務器生成更多的日誌數據。
  • 您可以使用Wireshark檢查是否確實發送了「r」命令。
+0

我已經使用了幾個telnet客戶端,這是行不通的。我使用的是windows telnet客戶端,它使用Velestar的vSSH應用程序。有趣的是,當使用ClockworkMod對android telnet客戶端進行測試時,服務器也沒有註冊命令。 – David

+0

偏題...說到Android的ssh/telnet客戶端,絕對試試Juice SSH,它是免費的。對於Android來說,最好的ssh/telnet客戶端。 =)回到主題,試試看看你的Android遠程登錄客戶端發送了什麼,並將它與其他遠程登錄客戶端進行比較?它可能就像線路結束或任何telnet設置一樣簡單......但如果沒有看到更多的測試結果,我現在真的無法想象任何事情。如果您發現問題所在,請在此處更新。 – flintlock

+0

我現在遠離硬件,所以我將無法測試,直到今晚晚些時候。但是,硬件開發人員告訴我,硬件期望該命令是ASCII編碼和CR終止。所以我會嘗試將PrintWrite初始化更改爲PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),「ASCII」)),true);並將打印命令寫入writer.print(command +「\ r」); – David

0

將編碼類型更改爲「US-ASCII」並添加一個回車而不是一個新行就行了。我能夠按預期讀取和寫入數據。