nio - 使用java7的AIO异步读取数据时发现有重复读取的现象
伊谢尔伦
伊谢尔伦 2017-04-17 15:04:56
0
1
445

使用如下代码读取socket channel中的数据到缓冲区中,程序对读取到的数据进行处理。
如果读取到的一批数据中,存在半个message的情况下,程序会将本次剩余的半个message数据保存起来,
等下次读取到数据后,进行合并,然后判断程序是否能正常执行,若不能则表示第二次读取到的数据与
之前保存起来的半个message数据不是同一批,则程序继续重新处理第二次读取到的数据,然后第三次读取
后再合并,再试着处理...直到合并后能成功处理。

现在发现,合并后能成功处理,但是后面仍然会读取到已经处理过的半个消息的后半段数据,不知道各位大侠
有没有遇见过这种情况?

socket.read(byteBuffer, null, new CompletionHandler<Integer, Void>() {
    @Override
    public void completed(Integer result, Void attachment) {
        if(result==-1){
            close();
            return;
        }
        byteBuffer.clear();
        if (result > 0) {
            byteBuffer.limit(result);
            LOG.debug("server socket [{}] get " + result + " data from client:{}", clientIdentifier, getString(byteBuffer, result));
            if (!connectted) {
                handleConnect();
            } else {
                if (remainingData != null) {
                    combineBuffer();
                }
                
                while (byteBuffer.position() < result) {
                    doProcess();
                }
            }
        }
        byteBuffer.clear();
        socket.read(byteBuffer, null, this);
    }

    @Override
    public void failed(Throwable exc, Void attachment) {
        LOG.error("Server socket [{}] read failed,{}.", clientIdentifier, exc.toString());
        close();
    }
});
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

모든 응답(1)
左手右手慢动作

另外还有个问题,就是每次read到的字节数是不一样的,我的消息大小定为2kb,通常情况下,客户端每发一个消息,那么server端就会read到2kb的数据,但是偶尔会有只read到1kb或者几百个字节的情况,有没有人知道这是怎么回事?

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!