2013-04-28 80 views
0

我從套接字讀取數據時遇到問題。我試圖用不同的方式解決我的問題,我認爲我的代碼現在是測試它的最簡單的方法。 Android有一個問題,從套接字讀取並停在這一行(inStream.read())。 10秒後(socket.setSoTimeout)我有一個消息-------錯誤:null。我想讀取任何數據(0-255)或-1,但沒有發生任何事情。在PHP(在我的服務器上,我的代碼)和PC(不是我的應用程序)一切都很好。我該怎麼辦?Android - inputStream.read() - 我什麼也看不懂

這是我的第一篇文章,所以我很抱歉可能的錯誤。謝謝你的幫助!

try{ 
    socket  = new Socket("192.168.0.150", 502); 
    socket.setSoTimeout(10000); 

    outStream = new DataOutputStream(socket.getOutputStream()); 
    inStream = new DataInputStream(socket.getInputStream()); 

    System.out.println("----------" + outStream); 
    System.out.println("----------" + inStream); 

    outStream.write(0x01); 
    outStream.write(0x03); 
    outStream.write(0x10); 
    outStream.write(0x00); 
    outStream.write(0x00); 
    outStream.write(0x04); 
    outStream.write(0x40); 
    outStream.write(0xC9); 

    outStream.flush(); 
    System.out.println("----------ok 1"); 

/////////////////////////////    

// Thread.sleep(50); 
    System.out.println("----------Test1: " + socket.isConnected()); 
    System.out.println("----------Test2: " + socket.isInputShutdown()); 

    int dat = inStream.read(); 
    System.out.println("----------ok2: "); 
} catch(Exception e){ 
    e.printStackTrace(); // <-- edit 
    System.out.println("----------Error: " + e.getMessage()); 
} 


------------ 

    <uses-permission android:name = "android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name = "android.permission.UPDATE_DEVICE_STATS" /> 
    <uses-permission android:name = "android.permission.CHANGE_WIFI_STATE" /> 
    <uses-permission android:name = "android.permission.WAKE_LOCK" /> 
    <uses-permission android:name = "android.permission.INTERNET" /> 

- 編輯 -

我的日誌:http://codepaste.net/eapot2

+0

使用e.printStackTrace()以獲取與捕獲到的異常相關的有意義的輸出。 – BobTheBuilder 2013-04-28 14:47:01

+0

我加了這一行。我的日誌:http://codepaste.net/eapot2 如果我刪除socket.setSoTimeout(10000);然後Android崩潰(沒有任何反應) – kamil4u 2013-04-28 15:12:30

回答

-1

更改端口1024-65565。端口502通常是不允許的。

+0

但我想通過modbus進行通信 - 它位於502端口(http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)。這個端口是一個標準,所以我必須從中讀取。 感謝您的回答,我等待另一個建議。 – kamil4u 2013-04-28 20:00:57

+0

更改端口號碼不會解決讀取超時問題。沒有答案。 – EJP 2013-04-28 22:47:18

+0

但是,如果我更改本地主機上的端口,這項工作(只使用寫和讀,而不是modbus) – barwnikk 2013-04-28 23:17:54

0

如果你有讀取超時,顯然沒有任何被對方發送。

注意'沒有任何反應'和'Android崩潰'不一樣。不要濫用標準術語。

+0

行。所以也許我應該再次描述問題。如果我在PHP中發送「01 03 10 00 00 04 40 C9」(作爲每個數字的十六進制($ value)),我有迴應。沒有超時我可以等待所有的時間,但我沒有迴應,可能發送數據的方式不好,但我該怎麼辦?使用其他設備時,這段代碼很好,我有回覆消息,但現在它是從其他公司獲得的,我有一個問題,也許我應該在使用「讀」之前在程序中使用「睡眠」50ms,但Thread.sleep(50);不幫我。 – kamil4u 2013-04-29 10:00:24