[問題] 關於封包傳送底層處理的方式

作者: tas72732002 (蔥頭)   2015-07-21 15:41:10
請問一下各位,
假設Server有兩個命令傳送到Client, 這兩個命令都非常長,
ex : {'apiName' : 'auth' , 'para' : 'xxxdffd.............'};
在傳送命令的時候, "一個命令可能被拆成好幾個封包傳送",
想請問OutputStream的處理會等到第一個命令都傳送完才傳送第二個命令嗎,
因為接收方如果還沒接收完第一個命令, 就接到了第二個命令的封包,
這樣有可能造成解析錯誤, 如下所示,
Client 接收過程 : 命令A第一個封包->命令B第一個封包->命令A第二個封包
我這邊的理解應該是OutputStream會傳送完第一個命令的封包,
才會傳送第二個命令的封包, 彼此不會交替
Client 接收過程 : 命令A第一個封包->命令A第二個封包->命令B第一個封包
->命令B第二個封包
不知大家的看法為何 ?
作者: mars90226 (火星人)   2015-07-21 15:56:00
你用TCP就會照順序,UDP就看運氣
作者: tas72732002 (蔥頭)   2015-07-21 15:57:00
第二個命令的封包不會插隊嗎?是因為io是single thread嗎?
作者: LaPass (LaPass)   2015-07-21 17:14:00
用tcp他會幫你搞定順序的問題
作者: cowbaying (是在靠北喔)   2015-07-21 17:52:00
會序列化不用擔心順序問題
作者: banjmin (HD)   2015-07-21 20:11:00
去google tcp sliding window
作者: omidofor (媽媽咪呀)   2015-07-21 20:41:00
高階語言都幫你封裝起來了,你根本不用擔心底層的問題反而應該要注意的是Outputsteam在multi-thread下有沒有co-operation的問題
作者: dou0228 (7777)   2015-07-22 08:43:00
TCP 沒有這問題, 除非你用 UDP 送
作者: tas72732002 (蔥頭)   2015-07-22 11:30:00
我想如果是multi-thread, Client又是single thread處理io, 應該就會造成插隊的情況吧
作者: LaPass (LaPass)   2015-07-22 13:40:00
socket最好用單一條執行序去處理。

Links booklink

Contact Us: admin [ a t ] ucptt.com