我仍在使用我的推送服务器!我已经使用 javax.crypto.cipher 成功实现了加密。这需要我读/写字节到套接字的流。我可以发送和接收就好了。加密有效。但是,当无线传输没有任何内容时,服务器会抛出 OutOfMemoryException。readBytes 函数是:
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() 停止阻塞时运行。这就是循环设计的工作方式。
如果这段代码看起来很熟悉,那是因为我在堆栈溢出时发现了它!
握手完美无缺,但是一旦它停止发送东西,大约五秒钟后我就得到了异常。
谢谢你能给我的任何帮助。