我已經構建了一個iPhone應用程序,它捕獲語音並使用NSOutputStream
實例流式傳輸到服務器。一旦流停止,iPhone會向服務器發送一條短消息「--- end ---」,並開始在NSOutputStream
上列出。 當服務器(使用C#構建)捕獲到「--- end ---」消息時,它會執行一些處理並將文本寫回客戶端。一旦客戶端收到結束消息,它將關閉NSOutputStream和NSInputStream
連接。如何使用iPhone和C完美的客戶端 - 服務器通信程序#
每次發送「結束」消息之前,我都會讓應用程序休眠0.5秒。然後我可以保證結束消息不與其他數據混合。這個系統在模擬器和我的網絡(100Mbps)下運行良好。
但是,當我將整個應用程序連接到慢速網絡(1.2 Mbps)時,整個通信消失了。有時結束消息與語音數據混合在一起,類似地,結束消息與從服務器發送的文本串聯起來。 但是,當我在服務器和客戶端中將線程休眠時間改爲3秒時,錯誤發生率降低了。
我知道這可能是設計我的網絡客戶端 - 服務器通信協議的問題。但我無法弄清楚如何修正它。
有人可以解釋我,我怎麼能克服這些問題?
@chatcja這是「競態條件」的定義,應該避免。您應該有一個「管理」連接的類,並且可能觸發應用程序接收的事件。如果你試圖「時間」這個,它永遠不會一直工作。希望有所幫助。 – 2010-07-20 02:18:47
感謝您的信息。 但我最初得到的問題是,iPhone - > C# 有時結束消息附加了語音數據。 C# - > iPhone 結束消息附加了結果文本。 您是否有理想單獨發送結束消息? – chatcja 2010-07-21 10:34:08
當你說「短信」時,你的意思是短信,還是你的意思是它在TCP流中增加了一些文本? TCP不保留消息邊界。您必須添加自己的機制來分隔會話組件,例如爲每個組件添加前綴長度。 – 2010-07-21 12:32:05