2013-06-19 16 views
1

我試圖從5個串口連接的設備讀取數據。如果設備健康,我的Java代碼運行良好,如果不是,則inputstream.read()掛起程序並且不允許進一步執行。如何在java中結束inputstream.read

我試過使用inputstream.available(),BufferedInputStream ...但沒有任何效果。

我想要做的是:如果設備沒有響應我的代碼,它應該自行結束,讓控制權轉到主程序,它將轉到下一個設備。套接字在輪詢一個週期內保持打開狀態。

Socket es = new Socket("10.12.90.153",4001); 
OutputStream osnew= es.getOutputStream(); 
InputStream isnew = new BufferedInputStream(es.getInputStream()); 

這在任務程序完成,然後我通過osnewisnew到每個設備以一秒的進一步行動的間隙。 osnew寫入設備響應的一些數據。然後我從isnew讀取...這是程序掛起的地方。

+1

你能寫一個像while(value!= null){value = read()}這樣的循環嗎?低於該循環,你可以編寫你的退出程序 – sotix

+1

我認爲http://stackoverflow.com/q/804951/946328的答案可以幫助你 –

回答

0

InputStream設計用於在您嘗試讀取數據時阻止並且不可用。你可以調用available()方法來查看是否有數據可以在沒有阻塞的情況下讀取,但這隻能以一種方式進行 - 如果available()返回非零值,那麼你知道你可以無阻塞地讀取數據,但如果它返回零,你不會需要被封鎖。對於輸入流總是available()返回零是完全有效的。

您可能希望查看java.nio的非阻塞I/O API,而不是使用流。

+0

我嘗試使用bufferinputstream.available以及inputstream.available ....兩者如果(isnew1.available()> 0) \t(//讀取響應 \t \t i = isnew1,則不工作 – user2454556

+0

。閱讀(ibufnew1,0,261); //做的東西 \t \t \t}此塊健康設備太 – user2454556

0

您可以在單獨的線程中處理每個設備。這樣,即使設備沒有啓動,程序也會保持響應。但請注意多線程編程的缺陷。

有關使用Java多線程編程的更多信息可以在http://docs.oracle.com/javase/tutorial/essential/concurrency/

+0

多線程可能不會在我的情況下,連接到串行設備的以太網設備可行允許2個連接在同一時間以及一旦我有來自5臺設備的數據我把它推入數據庫 – user2454556

0

你是如何從設備中讀取發現了什麼?我假設你正在使用某種形式的FileInputStream來完成它。該類看起來適合從文件系統讀取給我,但是可能會阻塞很長一段時間的設備可能會鎖定Java線程,直到設備響應爲止。您需要對設備進行某種定時讀取請求,並且我不知道有任何Java類會這樣做。

我最好的建議是寫一些JNI代碼,很好的說話,並不會阻止您的設備停止響應。這是我在與USB設備通話時所做的。如果我編碼這個(對於Linux),我會使用select(它有一個時間段參數)來等待來自任何設備的輸入。