У меня проблема со следующим кодом.
Если я использую ObjectOutputStream, все работает нормально, но когда я пытаюсь использовать CipherOutputStream, я получаю следующую ошибку на стороне сервера.
Если я отправляю один файл, я не получаю его полностью.
Если я отправляю более одного файла, последний отправляется не полностью, а предыдущий.
Что бы это могло быть?
Я видел другие сообщения, но они мне не помогли.
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:128)
at myCloudServer$myCloudServerThread.run(myCloudServer.java:257)
Код клиента. Отправка файла.
SocketFactory socketFactory = SSLSocketFactory.getDefault();
clientSocket = socketFactory.createSocket(serverAddress[0], Integer.parseInt(serverAddress[1]));
ObjectInputStream objectInputStream = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
[...]
byte[] buffer = new byte[1024];
objectOutputStream.writeObject(sendingClientFiles.size());
for (File sendingClientFile : sendingClientFiles) {
[...]
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKeyEncrypt = keyGenerator.generateKey();
Cipher cipherEncrypt = Cipher.getInstance("AES");
cipherEncrypt.init(Cipher.ENCRYPT_MODE, secretKeyEncrypt);
CipherOutputStream cipherOutputStream = new CipherOutputStream(objectOutputStream, cipherEncrypt);
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(sendingClientFile));
int count = 0;
while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) {
//objectOutputStream.write(buffer, 0, count);
cipherOutputStream.write(buffer, 0, count);
}
bufferedInputStream.close();
//objectOutputStream.flush();
cipherOutputStream.flush();
}
Код сервера. Получение файла.
ServerSocketFactory serverSocketFactory = SSLServerSocketFactory.getDefault();
serverSocket = serverSocketFactory.createServerSocket(port);
Socket clientSocket = serverSocket.accept();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream objectInputStream = new ObjectInputStream(clientSocket.getInputStream());
[...]
byte[] buffer = new byte[1024];
int i = 0;
int receivingClientFiles = (int) objectInputStream.readObject();
while(i < receivingClientFiles) {
[...]
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(diretorio + "/" + fileName));
int count = 0;
int received = 0;
while (received < fileLength) {
count = objectInputStream.read(buffer, 0, buffer.length);
bufferedOutputStream.write(buffer, 0, count);
received += count;
}
//while ((count = objectInputStream.read(buffer, 0, buffer.length)) != -1) {
// bufferedOutputStream.write(buffer, 0, count);
//}
bufferedOutputStream.close();
i++;
}