• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 2, 文章 - 73, 評論 - 60, 引用 - 0
            數(shù)據(jù)加載中……

            J2ME中Socket如何正確讀取緩沖區(qū)中的數(shù)據(jù)

            1.問題描述

            在wkt模擬器上, 通過以下代碼可以正確的讀出數(shù)據(jù):
             
             conn = (SocketConnection) Connector.open(url, Connector.READ_WRITE, true);
              
              is = conn.openDataInputStream();
              os = conn.openDataOutputStream();
              // 創(chuàng)建登陸報(bào)文
              loginPacketBytes = generateLoginPacket();
             
              // 發(fā)送登陸報(bào)文
              // System.out.println("****發(fā)送登陸報(bào)文****");
              os.write(loginPacketBytes, 0, loginPacketBytes.length);
              os.flush();
             
              // 先讀取ConstantValue.HEADER_LENGTH個字節(jié),循環(huán)遍歷尋找正確的魔數(shù)
              recByteNum = is.read(recBytes, 0, ConstantValue.READ_LENGTH);


            若從服務(wù)器真是返回的字節(jié)數(shù)是100個字節(jié), 而ConstantValue.READ_LENGTH定義的長度大于100.
             那么在模擬器上沒有問題, 能夠讀到100個字節(jié).

            但是到了真機(jī)上面測試, 若定義的要讀取的字節(jié)數(shù)大于實(shí)際傳送的字節(jié)數(shù), 那就會出現(xiàn)異常情況.

            導(dǎo)致根本就讀不到數(shù)據(jù).

            2.解決方法

            先讀取一小部分?jǐn)?shù)據(jù), 得到報(bào)文頭(一般都有報(bào)文頭, 報(bào)文頭中都有整個報(bào)文的總長度)
            解析報(bào)文頭, 這里需要注意的是可能收到的第一個數(shù)據(jù)并不就是報(bào)文的有效數(shù)據(jù), 報(bào)文的有效數(shù)據(jù)可能并不在數(shù)據(jù)緩沖區(qū)的首位置, 所以需要正確找到報(bào)文頭, 方法各不相同, 有的是使用魔數(shù)這種方式, 有個就靠判斷某個值是否等于報(bào)文的總長度. 總之記住有效報(bào)文的開始位置, 這里記著index,
            然后創(chuàng)建一個字節(jié)緩沖區(qū), 剛好來接受剩余的數(shù)據(jù)
            byte addBytes[] = new byte[recHeader.getBufferSize() + index - (recByteNum - ConstantValue.HEADER_LENGTH)];
            is.readFully(addBytes);

            這樣一般就可以正確的讀出有效數(shù)據(jù)了.

            3.最新方法
               int loop = 0;
               int hasReadLen = 0;
               
               // 讀取報(bào)文頭
               while (true)
               {
                loop++;
                
                if (loop >= m_oNET_DVR.m_iTimeOutVal / NET_DVR_PARAM.LOOP_INTERVAL)
                {
                 SDK.SetLastError(NET_DVR_Dec.NET_DVR_NETWORK_RECV_TIMEOUT);
                 return NET_DVR_Dec.RET_FAIL;
                }
                 
                if (m_oCfgIs.available() >= NET_DVR_PARAM.REC_PACKET_HEADER_LENGTH)
                {
                 // 讀取報(bào)文頭
                 recByteNum = m_oCfgIs.read(m_byCfgRecBuf, 0, NET_DVR_PARAM.REC_PACKET_HEADER_LENGTH);
                 
                 hasReadLen += recByteNum;
                 
                 if (recByteNum == NET_DVR_PARAM.REC_PACKET_HEADER_LENGTH)
                 {
                  // 解析報(bào)文總長度
                  pakcetTotalLen  = NetHelper.convertNetBytesToInt(m_byCfgRecBuf, 0);
                  break;
                 }
                 else
                 {
                  SDK.SetLastError(NET_DVR_Dec.NET_DVR_NETWORK_RECV_ERROR);
                  return NET_DVR_Dec.RET_FAIL;
                 }
                }
                
                Thread.sleep(NET_DVR_PARAM.LOOP_INTERVAL);
               }
               
               // 讀取報(bào)文體
               while (true)
               {
                loop++;
                
                if (loop >= m_oNET_DVR.m_iTimeOutVal / NET_DVR_PARAM.LOOP_INTERVAL)
                {
                 SDK.SetLastError(NET_DVR_Dec.NET_DVR_NETWORK_RECV_TIMEOUT);
                 return NET_DVR_Dec.RET_FAIL;
                }
                
                // 讀取剩余數(shù)據(jù)
                recByteNum = m_oCfgIs.read(m_byCfgRecBuf, hasReadLen, pakcetTotalLen - hasReadLen);
                
                hasReadLen += recByteNum;
                
                // 讀取完畢
                if (hasReadLen >= pakcetTotalLen)
                {
                 break;
                }
                else
                {
                 Thread.sleep(100);
                 continue;
                }
               }

            posted on 2009-04-16 09:34 郭天文 閱讀(1629) 評論(0)  編輯 收藏 引用 所屬分類: J2ME

            日韩久久久久中文字幕人妻| 久久久国产精华液| 国产91久久综合| 日日狠狠久久偷偷色综合96蜜桃| 亚洲?V乱码久久精品蜜桃| 99久久精品国产一区二区 | 2021国产成人精品久久| 久久99精品国产99久久6| 亚洲精品无码久久久久| 成人亚洲欧美久久久久| 久久久久亚洲av无码专区| 久久久91人妻无码精品蜜桃HD| 国内精品九九久久精品| 国产高潮久久免费观看| 亚洲精品无码成人片久久| 久久久久久久久久免免费精品 | 秋霞久久国产精品电影院| 精品国产日韩久久亚洲| 99久久99久久精品国产片| 亚洲成色www久久网站夜月 | 久久99精品久久只有精品| 一级a性色生活片久久无少妇一级婬片免费放| 亚洲精品乱码久久久久久 | 久久久艹| 热99re久久国超精品首页| 亚洲国产精品久久久天堂| 三级韩国一区久久二区综合| 国产高潮国产高潮久久久91| 精品免费久久久久久久| 久久99久国产麻精品66| 久久福利资源国产精品999| 久久亚洲AV永久无码精品| 国产精品免费久久久久久久久 | 精品久久久久久久久免费影院| 久久国产午夜精品一区二区三区| 97精品伊人久久大香线蕉app| 亚洲国产精品无码久久久蜜芽| 日韩欧美亚洲综合久久 | 国内精品久久久人妻中文字幕| 亚洲乱码中文字幕久久孕妇黑人 | 国内精品免费久久影院|