作者tas72732002 (蔥頭)
看板java
標題[問題] 關於封包傳送底層處理的方式
時間Tue Jul 21 15:41:10 2015
請問一下各位,
假設Server有兩個命令傳送到Client, 這兩個命令都非常長,
ex : {'apiName' : 'auth' , 'para' : 'xxxdffd.............'};
在傳送命令的時候, "一個命令可能被拆成好幾個封包傳送",
想請問OutputStream的處理會等到第一個命令都傳送完才傳送第二個命令嗎,
因為接收方如果還沒接收完第一個命令, 就接到了第二個命令的封包,
這樣有可能造成解析錯誤, 如下所示,
Client 接收過程 : 命令A第一個封包->命令B第一個封包->命令A第二個封包
我這邊的理解應該是OutputStream會傳送完第一個命令的封包,
才會傳送第二個命令的封包, 彼此不會交替
Client 接收過程 : 命令A第一個封包->命令A第二個封包->命令B第一個封包
->命令B第二個封包
不知大家的看法為何 ?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.144.199
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1437464473.A.56D.html
※ 編輯: tas72732002 (125.227.144.199), 07/21/2015 15:41:24
1F:推 mars90226: 你用TCP就會照順序,UDP就看運氣 07/21 15:56
2F:→ tas72732002: 第二個命令的封包不會插隊嗎? 07/21 15:57
3F:→ tas72732002: 是因為io是single thread嗎? 07/21 15:57
※ 編輯: tas72732002 (125.227.144.199), 07/21/2015 15:58:18
4F:推 LaPass: 用tcp他會幫你搞定順序的問題 07/21 17:14
5F:→ cowbaying: 會序列化 07/21 17:52
6F:→ cowbaying: 不用擔心順序問題 07/21 17:53
7F:推 banjmin: 去google tcp sliding window 07/21 20:11
8F:推 omidofor: 高階語言都幫你封裝起來了,你根本不用擔心底層的問題 07/21 20:41
9F:→ omidofor: 反而應該要注意的是Outputsteam在multi-thread下有沒有 07/21 20:43
10F:→ omidofor: co-operation的問題 07/21 20:43
11F:→ dou0228: TCP 沒有這問題, 除非你用 UDP 送 07/22 08:43
12F:→ tas72732002: 我想如果是multi-thread, Client又是single thread 07/22 11:30
13F:→ tas72732002: 處理io, 應該就會造成插隊的情況吧 07/22 11:31
14F:推 LaPass: socket最好用單一條執行序去處理。 07/22 13:40