近作了一個報文發送接收解析的客戶端,發現了這樣的問題:
某程序:
Socket con = new Socket(ip, port);//一個socket
InputStream socketIn = con.getInputStream();
InputStreamReader isr=new InputStreamReader(socketIn, "UTF-8");
while ((headchar = isr.read()) != -1) {// 讀取報文頭 用字符流來讀取
headres += (char) headchar;
......//一些邏輯 處理報文頭
}
...
//報文頭讀完了 獲取了報文體的大小等內容 開始讀報文體
byte tempbuf[] = new byte[buffsize];
int start = 0;
int tem = -1;
//用字節流來讀報文體
while ((tem = socketIn.read(tempbuf, start, buffsize)) != -1) {
log.info("從"+start+"開始讀"+buffsize);
log.info("實際讀取" + tem);
if (tem < outparamsizes[i]) {
start = start + tem;
buffsize = buffsize - tem;
...//一些邏輯 處理報文體 讀取完畢
}
這樣的程序,在windows下正常工做,再放到linux下,讀完報文頭開始讀取報文體的時候,並無從報文體的開頭開始讀取,而是丟失了報文體前面的一些數據,致使讀不到足夠的數據直到超時。
通過一番調試和請教後發現緣由:在linux下一個InputStream不能用字符流和字節流分段讀取,由於linux下的字符因爲utf8編碼會多加幾位,用字符讀完報文頭後其實就已經多讀了許多位,再用字節讀就丟掉多讀的那部分了。
所以,只要將讀取報文頭的部分也改爲字節流讀取就能夠了
while ((headchar = socketIn.read()) != -1) {
...}