小生最近做個產品 socket通信,對這塊了解甚少,同樣對C也了解甚少。把需要的功能實現了,但是異常方面總覺得應該做些什么,但不了解有什么地方需要實現。服務器過來的是逐楨圖片,大概的實現流程,使用的AsyncSocket,服務器發送數據量,先放入NSMutableData *totalData中,每過來一個數據就appendData,加入到totalData里面,然后到數據模塊里面對16進制數據進行處理,得到一張完整的圖片后將其從toatlData中使用subdataWithRange將其remove.因為測試環境也是我自個搭建的,不知道正常使用下會有多少異常,我有幾個疑惑的地方: 1,我沒實現ringbuffer,直接通過NSMutableData來處理,這個會有影響不? 2,對于數據的接受方面,直接append會不會有數據錯位的情況,對于數據的部分丟失一般是直接remove掉還是保留? 3,每接受到一次數據才處理一次。也就是說每響應一次socket的delegate才處理一次數據會不會太慢?- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
2 回答

holdtom
TA貢獻1805條經驗 獲得超10個贊
1,關于接收數據那塊,didReadData的delegate中用一個NSMutableData即可,接收到數據后先判斷,看是否需要使用appendData加入進來,如果剛好讀取完一個完整的數據,先copy出來去操作,并將NSMutableData設置為nil,下一個數據進來重新初始化并添加。這樣保證內存中最多只有一個完整的數據。 而且處理完就得繼續readData。
2,關于數據的容錯,是否完整這個就得根據文件楨頭來進行判斷,客戶端自己決定如何丟棄。
3,實際上接收的速度是和服務器發送的速度相關的,服務器控制發送時間間隔即可。客戶端就得不斷的讀取,操作。
最后如何組合圖片序列為視頻 使用AVAssetWriter即可,可以控制每秒多少張,包括儲存的格式,沒必要去使用ffmpeg或者自己寫數據頭。

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
你發送端就要序列化數據,接收端就不會錯位的。一般情況下是不會產生錯位的。每次接收數據你可以計算NSData的大小的,不需要使用什么subdataWithRange,最好的好就是使用append。delegate這個是接收到一定的長度或者小于這個長度就會delegate。如果數據量很大的話,會產生分成很多個數據包傳輸。所以一次delegate有可能不是一個完整的數據
- 2 回答
- 0 關注
- 341 瀏覽
添加回答
舉報
0/150
提交
取消