Re: [問題] 有關socket inputstream和outputstream的問題
我發現我忘了寫應對這種東西的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
03/15 21:01, 1F
推
03/15 22:07, , 2F
03/15 22:07, 2F
推
03/17 11:54, , 3F
03/17 11:54, 3F
討論串 (同標題文章)
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章