簡體   English   中英

Java AsynchronousSocketChannel讀取操作

[英]Java AsynchronousSocketChannel read operation

我在我的項目中使用了nio2的java AsynchronousSocketChannel 我也在ubuntu 14.04上使用oracle jdk 1.7.0_80。

我的項目是一台處理二進制數據的服務器。 該代碼在CompletionHandler匿名類的完成方法中遞歸調用讀取操作,如下所示:

private final CompletionHandler<Integer,AsynchronousSocketChannel> readHandler=new CompletionHandler<Integer,AsynchronousSocketChannel>(){

    @Override
    public void completed(Integer result,AsynchronousSocketChannel attachment) {
        if(result<0){
            attachment.close();
            return;
        }
        attachment.read(swap, attachment, this);
    }
}

其中變量swap是ByteBuffer實例。

顯然,一切正常。 但是,有一個總大小為3832字節的數據包,當服務器接收到沒有分段的整個數據包時,就沒有問題。 但是,有時將此數據包分為兩個或更多部分(TCP片段)。 例如:第一段的大小為2896字節,第二段的大小為936字節。

最后一段沒有標題,這破壞了我的算法。 我想知道,是否只有在讀取整個數據包之后,API才能調用“ completed”方法?

我已經將SO_RCVBUF增加到64K,但是它不起作用。

我想知道,是否只有在讀取整個數據包之后,API才能調用“ completed”方法?

不,沒有辦法做到這一點。

TCP協議可以分解任意大小的數據包中的字節流。 在TCP之上使用的應用程序級協議一定不能依賴總是在一個TCP數據包中完全發送的消息。

您必須以一種可以處理以任意大小的數據包分解的消息的方式設計應用程序級別協議。

一種常用的方法是在應用程序級別的消息前面加上長度字段。 例如,應用程序級消息由4個字節的字段組成,該字段包含消息其余部分的長度。 收到消息時,首先要接收長度,然后繼續接收,直到收到那么多字節為止,然后可以將其組合成應用程序級消息。

AsynchronousSocketChannel API無法為您自動重新組合應用程序級消息,因為它對您的應用程序級協議一無所知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM