2009-11-18 104 views
3

在通過藍牙從PC發送數據到我的手機(N73)時,輸入流似乎掛斷。 InputStream源自StreamConnection。J2ME,InputStream在通過藍牙接收到40K數據後掛機

PC軟件是在VB.net中構建的。 Java ME移動版。

InputStream是否有一個內部緩衝區,需要在讀取大塊數據時清空? 數據以10Kb到15Kb範圍的塊接收,讀數在接收到第三個塊後停止。奇怪的是我沒有收到任何例外。

我瀏覽了InputStream類API文檔,找不到任何InputStream清除方法或空方法。 只有一個reset()方法,我不知道它的用途是什麼?

+0

您是如何讀取數據的? (即你正在調用哪個「讀取」方法?) – 2009-11-18 13:00:01

+0

read(byte [] b,int off,int len) – 2009-11-18 13:49:51

回答

3

InputStream.reset()是你有使用Inpustream.mark()逼的InputStream創建一個內部緩衝區,將讓你同樣的數據多次讀取後的某個時間調用一個方法,假設的InputStream通過調用InputStream.markSupported()時返回true支持它。就數據傳輸問題而言,我們談論的是在Symbian OS 9.1之上運行Series60第三版的手機。鑑於JSR-82的Symbian測試有多大,一個實施錯誤就像InputStream的40k限制那樣簡單,似乎不大可能。

如果服務器以較低的比特率發送較小的塊,手機行爲是否會發生變化?
手機進程在閱讀更多內容之前是否收到數據?
MIDlet還在做什麼?即使在藍牙InputStream模塊之後,其他所有部件的工作情況都與預期的相符

我記得在JSR-82實現了相當重要的bug可能已經初步N73固件後,只有固定的創建:不要在任何情況下分派線程使用藍牙在所有(而不是從像MIDlet.startApp()任何方法,Canvas.keyPressed(),CommandListener.commandAction(),PlayerListener.playerUpdate() ...)。

你最好只使用自己寫的Thread.run()方法中的藍牙。

+0

我還沒有嘗試以較低的比特率發送較小的塊? 如何控制手機的藍牙比特率,我不認爲我已啓用該設置,無論它是什麼,它現在默認運行?這似乎是一個重要問題。 手機只是將所有數據塊存儲在Vector的單獨插槽中,每個插槽都是一個字節數組。 Midlet此時正在從輸入流(第1個線程)讀取,寫入輸出流(第2個線程)並繪製畫布(第3個線程)。而且這幅畫更像是一個日誌,可供我調試手機。 – 2009-11-18 17:21:44

+1

我在Andre Klingsheim的網站上發現了一個名爲「J2ME藍牙編程」的重要PDF文件。 在藍牙陷阱的範疇,他指出: 「還必須謹慎關於一次發送的數據量採取看來的 一個使用的緩衝區在6600個P900智能手機爲512個字節當試圖 。一次傳輸超過512個字節,接收器獲得512個字節,然後連接將凍結。發送512字節,刷新,發送1字節回來,並沖洗 工作正常。連接然後保持活着。 「 – 2009-11-18 17:24:22

+0

它是一個已知的問題,因爲報告‘中的MIDlet使用藍牙串行端口’諾基亞維基 KIJ000109 概述 閱讀傳入數據流不以某些諾基亞S60和Series 80臺設備正常工作。 已報告對 S60第二版:諾基亞6600 v.4.09.1 S60第二版功能包1:諾基亞6620,諾基亞6260,諾基亞6670,諾基亞7610 系列80第二版:諾基亞9300,諾基亞9500 該文件似乎過時到2004年。 他們現在應該肯定已經解決了這個錯誤。 – 2009-11-19 05:17:40