我仍在使用我的推送服務器!我已經使用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()停止阻塞時運行。這就是循環設計的工作原理。
如果這段代碼看起來很熟悉,那是因爲我發現它在堆棧溢出!
握手完美地工作,但只要它停止發送東西,我會在五秒鐘後發生異常。
謝謝你給我的任何幫助。
你可以在聲明'byte [] data'之前打印'len'的值還是放一個斷點?顯然它真的很龐大(數以億計)。 –
你能提供更多的代碼來使用嗎?我認爲發生的事情是readBytes被調用太多了。 – DankMemes
所有其他代碼都是不相關的。這是所有事情發生的地方。問題不在於while循環封裝的代碼,我認爲readInt不是像它應該阻塞的那樣? –