2011-03-03 50 views
1

我在我的應用程序中遇到問題,從ip = 192.168.0.3和端口= 502的套接字讀取。另一個程序通過片段將消息寫入該端口片段(mac fragmnet長度爲205字節),我需要逐個片段讀取該消息。但是當我寫這篇文章的時候,我把所有的片段都放在一個大的文件中套接字輸入流不會按片段讀取片段

boolean last=false; 
       int numberFragment=0; 
       while (((!last)) ) { 

        numberReceived = socketInputStream.read(buffer); 
        numberFragment++; 
        tempBuffer = new byte[numberReceived]; 
        ByteBuffer baferce = ByteBuffer.wrap(tempBuffer); 
        baferce.put(buffer, 0, numberReceived); 
        //System.out.println("RECEIVED="+(new String(tempBuffer))); 
        last=ResponseFragmentCheck.IsLastFragment(tempBuffer, numberFragment); 
        System.out.println("LAST ="+last); 

        PrintBytesArray(tempBuffer); 
        received.add(tempBuffer); 
       } 

有沒有什麼辦法,我Java閱讀片段?

回答

3

如果您希望Java讀取片段片段,有兩件事情你必須做:

  1. 使用UDP,TCP沒有。你可能已經在做這個。使用Socket.receive()可獲得DatagramPacket

任何流方法都可能無法尊重片段邊界。

-1

如果您正在使用TCP,請確保您的其他程序在編寫一個片段後調用flush()(或其他語言中的等效項)。否則,可能會通過發送TCP堆棧收集碎片,直到有足夠的數據填充一個TCP數據包(取決於實現和可能的某些設置)。

當然,您仍然無法一個接一個地接收數據包/碎片,但您至少一定要儘可能快地接收它們。

如果您需要您的數據包結構,可以使用另一種協議而不是TCP,或使用TCP協議,它會在數據包開始和結束時向您顯示。

+0

不真實。寫入被收集,直到一組複雜的條件成立爲止,其中包括填充緩衝區,定時器到期時間,收到未決的ACK。並且沖洗()仍不能確保數據以與發送的量相同的量接收。這是一個字節流。 – EJP

+0

你使用哪種語言/ API對套接字有flush()? – Andrew

2

TCP中沒有「碎片」。它是一個字節流。如果要讀取特定長度的消息,請使用DataInputStream.readFully()。如果您想以與發送消息相同的方式讀取消息,則必須爲每個消息添加一個長度字,或使用類型長度值協議或自描述協議(如XML)。