2013-01-19 81 views
0

我仍在使用我的推送服務器!我已經使用javax.crypto.cipher成功實現了加密。這需要我讀/寫字節到套接字的流。我可以發送和接收很好。加密工作。但是當沒有任何事情發生時,服務器會拋出OutOfMemoryException異常。該的ReadBytes功能是:從TCP連接讀取字節數組時拋出OutOfMemory異常服務器

public static byte[] readBytes() throws IOException { 
    int len = dis.readInt(); 
    byte[] data = new byte[len]; 
    if (len > 0) { 
     dis.readFully(data); 
    } 
    return data; 
} 

調用這是代碼:

public String read() { 
      byte[] encrypted,decrypted = null; 
      try { 
        encrypted = readBytes(); 
        if (encrypted.equals(new Byte[] {0})) return ""; 
        if (encrypted.equals(null)) return null; 
        cipher.init(Cipher.DECRYPT_MODE, key); 
        decrypted = cipher.doFinal(encrypted); 
      } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } 
      String afterEncryption = new String(decrypted); 
      return afterEncryption; 
    } 

和read()被調用一個while循環:

while (true&loggedin&((inputLine=read())!=null)) { 

這是例外拋出的是:

Exception in thread "ServerThread" java.lang.OutOfMemoryError: Java heap space 
    at ServerThread.readBytes(ServerThread.java:277) 
    at ServerThread.read(ServerThread.java:245) 
    at ServerThread.run(ServerThread.java:108) 

行277是聲明字節數組的那個。發送字節數組的功能是:

public static void sendBytes(byte[] myByteArray, int start, int len) throws IOException { 
    if (len < 0) 
     throw new IllegalArgumentException("Negative length not allowed"); 
    if (start < 0 || start >= myByteArray.length) 
     throw new IndexOutOfBoundsException("Out of bounds: " + start); 
    if (len > 0) { 
     dos.writeInt(len); 
     dos.write(myByteArray, start, len); 
    } 
} 

sendBytes只在read()停止阻塞時運行。這就是循環設計的工作原理。

如果這段代碼看起來很熟悉,那是因爲我發現它在堆棧溢出!

握手完美地工作,但只要它停止發送東西,我會在五秒鐘後發生異常。

謝謝你給我的任何幫助。

+0

你可以在聲明'byte [] data'之前打印'len'的值還是放一個斷點?顯然它真的很龐大(數以億計)。 –

+0

你能提供更多的代碼來使用嗎?我認爲發生的事情是readBytes被調用太多了。 – DankMemes

+0

所有其他代碼都是不相關的。這是所有事情發生的地方。問題不在於while循環封裝的代碼,我認爲readInt不是像它應該阻塞的那樣? –

回答

0

你幾乎可以肯定在你的協議和讀取數據時會出現同步,就好像它是一個長字。跟蹤你的長度字和字節數組的長度,當你發送它們並接收它們並匹配它們。

您應該仔細研究一下使用CipherInputStream和CipherOutputStream的事情:他們爲您做了很多這樣的咕嚕工作。甚至SSL。

+0

你說得對,但是當我說'readShort()'它有效時怎麼辦? –

+0

@OsmiumUSA這表明正在發送*的內容是短的,而不是整數。你不覺得嗎? – EJP

+0

正確,但'sendBytes()'正在執行'writeInt()',因此在另一側的適當檢索是'readInt()'。這個函數是否寫入前面的零?邏輯決定了它必須但我不確定了。 –

相關問題