Re: [問題] 有關socket inputstream和outputstream的問題

看板AndroidDev作者 (殺人貓™)時間12年前 (2012/03/15 21:00), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串4/4 (看更多)
我發現我忘了寫應對這種東西的workaround了... 事實上當你寫server的時候,很多時候你是沒得選擇的。 根據我自己的經驗,會犯下這種錯誤的coder其實比率是相當高的 只是絕大多數都是在windows下作業跟跑server,有時候是一些3rd party server來講你很難做些什麼。畢竟code不是你寫的,你也沒source code 你更沒辦法把寫client的人抓過樓狗幹一頓(我個人是稱為「友善的爭論」XD) 既然改不了client,那我們只好改server,讓server吃得下這些錯誤的東西 在談讓server怎麼吃這些東西而不至於拉肚子以前,我先講個瘟腥小故事 IE7以前的世界,事實上browser是非常「友善」的 友善到一些明明是錯的東西他照樣吃 比方說<p>沒</p>,<body><p>...</body></p>照吃不誤 這樣其實大家寫code都很開心,問題是每個browser都用不一樣的方法去解譯它 所以造成了同一組code的效果不見得一樣。 這造成了html界的大混亂,也間接導致了嚴格規範的xhtml誕生。 (不過這東西始終沒有來的及正式長大,就被html 5.0取代了) 請注意,我們現在做的事情就跟以前「友善的」server一樣,是不對的 但是這是一種沒辦法中的辦法 說穿了很簡單,我們改用一個字元一個字元的去讀它(沒buffer想必這會很耗力) 當我們讀取到\r的時候,我們會打開一個flag, 然後將\r後面多寫一個\n 下一個如果是\n的時候我們就把flag關閉並且跳過這個\n,不是的話關閉flag繼續 具體的code大約是這樣(我個人是用filterinputstream處理這種東西) boolean LRFlag = false; while(char input = in.read()) { if(input == '\r') { LRFlag = true; out.write(input); out.write('\n'); continue; } if(input == '\n' && flag == true) { flag = false; continue; } flag = false; out.write(input); } 繼承fliterinputstream在read裡面插入這一段(也有一種寫法是override skip(), 方法大同小異,我是比較喜歡override skip()就是,不過這比較少為人知) hope it helps -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.167.139.229

03/15 21:01, , 1F
沒版主的板要賺個P都沒得賺 兩篇都是 悲淒 XD
03/15 21:01, 1F

03/15 22:07, , 2F
有看有推 XDDDD
03/15 22:07, 2F

03/17 11:54, , 3F
03/17 11:54, 3F
文章代碼(AID): #1FOUV-zs (AndroidDev)
文章代碼(AID): #1FOUV-zs (AndroidDev)