2011-06-20 48 views
1

我需要在Android上實現一個簡單的Telnet客戶端。我試圖用org.apache.commons.net.telnet.TelnetClient類:無法從Android上的Telnet服務器收到任何響應

TelnetClient telnet = new TelnetClient(); 

telnet.connect("localhost", PORT); 

InputStream inStream = telnet.getInputStream(); 
PrintStream outStream = new PrintStream(telnet.getOutputStream()); 

outStream.println(COMMAND); 
outStream.flush(); 

int ch = 0; 
while((ch = inStream.read()) != -1) { 
    log("Respose:" + ch); 
} 

inStream.read()塊。

同時,我可以從服務器使用來自Market的遠程應用程序獲得響應。

任何想法我做錯了什麼?

+0

也許使用緩衝區,如'byte [] b = new byte [256]; inStream.read(b)'? – marioosh

+0

同樣的結果,閱讀(b)塊 – anagaf

+0

和COMMAND是? – Snicolas

回答

0

它是否會阻止一些字符?因爲只有在達到inputStream的末尾時纔要求它停止讀取。

我不知道telnet protocole,但在我看來,你應該從輸入流中讀取行,例如使用BufferedReader。並且一旦從服務器讀取一行,處理它。

+0

我根本沒有收到任何字符。 inSream.available()總是返回0. – anagaf

0

我認爲不要使用「localhost」,而是使用該特定機器的IP地址。

+0

與服務器的連接已成功建立。無論如何,我嘗試127.0.0.1 - 沒有運氣。請注意服務器和客戶端都在同一個Android設備上工作。 – anagaf

0

我使用apache telnet客戶端,我有同樣的問題。原因是telnet服務器是流式響應,並且沒有END令牌。像線尾等..等等。

所以你會繼續獲取字節,如果沒有傳入的字節,那麼它會阻塞在read()方法。

所以我使用StringBuilder保持所有傳入的字節爲字符,並且還跟蹤特定的字符串(「:/#」),它始終位於傳輸流的末尾(用於telnet連接)。即使在第一次連接。

這是我使用的代碼的一部分。

StringBuilder builder = new StringBuilder(); 
TelnetClient telnet = new TelnetClient(); 
telnet.connect("127.0.0.1", 23); 
outstr = telnet.getOutputStream(); 
instr = telnet.getInputStream(); 
int cnt =0; 
    while(isConnected){ 
     if(builder.toString().endsWith(":/ #")){ 
       cnt++; 
       if(cnt==2){ 
        Log.i("DATA : ", builder.toString()); 
        builder.delete(0, builder.length()); 
        cnt=1; 
       } 
     } 
     builder.append((char)instr.read()); 

    } 

你是否注意到,如果計數器「CNT」達到2和計數器設置爲1 「CNT」助洗劑清洗顯示令牌(「:/#」)的數量我選擇定義結束的流。

第一次連接會給出第一個令牌,但爲了得到需要的末尾反向來決定它是否是結束令牌。這就是爲什麼我使用計數器。

建議:在不同的線程上保持監聽代碼,並在另一個線程中發送代碼。 (最終你會的,因爲Android的,你需要處理networkOnMainThread ..等)

:以上代碼是不是一個完整的副本。但它是工作的一個簡化部分。完整版本以分佈式形式分隔監聽,命令發送和異常處理。

相關問題