ObjectInputStream застрял при инициализации при его создании как на клиенте, так и на сервереJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ObjectInputStream застрял при инициализации при его создании как на клиенте, так и на сервере

Сообщение Anonymous »

Код: Выделить всё

ObjectInputStream
будет инициализироваться нормально только при создании ObjectInputStream на стороне клиента и ObjectOutputStream на стороне сервера, но при последующем создании ObjectInputStream на стороне сервера выполнение просто останавливается на неопределенный срок. Что может быть причиной этого?
Ниже приведен простой пример воспроизведения проблемы:

Код: Выделить всё

package Server;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {
public static void main(String[] args) throws Exception {
int port = 5000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started.  Waiting for connection...");
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected.");

// Hardcoded key and IV
byte[] keyBytes = "1234567890123456".getBytes();
byte[] ivBytes = "1234567890123456".getBytes();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);

// Setup Cipher and Streams
Cipher cipher_enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_enc.init(Cipher.ENCRYPT_MODE, key, iv);
Cipher cipher_dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_dec.init(Cipher.DECRYPT_MODE, key, iv);
CipherOutputStream cipher_encOut = new CipherOutputStream(clientSocket.getOutputStream(), cipher_enc);
CipherInputStream cipher_decIn = new CipherInputStream(clientSocket.getInputStream(), cipher_dec);

System.out.println("Ciphers initialized.");
ObjectOutputStream objOut = new ObjectOutputStream(cipher_encOut);
System.out.println("ObjectOutputStream initialized.");
objOut.writeObject("Hello from Server!");
objOut.flush();

//REMOVING THIS BLOCK WILL MAKE THE CODE WORK JUST FINE
ObjectInputStream objIn = new ObjectInputStream(cipher_decIn);
String message = (String) objIn.readObject();
System.out.println("Message from server: " + message);

objOut.close();
objIn.close();
clientSocket.close();
serverSocket.close();
System.out.println("Server finished.");
}
}

Код: Выделить всё

package Server;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.Socket;

public class SimpleClient {
public static void main(String[] args) throws Exception {
String host = "localhost";
int port = 5000;
Socket socket = new Socket(host, port);
System.out.println("Connected to server.");

// Hardcoded key and IV
byte[] keyBytes = "1234567890123456".getBytes();
byte[] ivBytes = "1234567890123456".getBytes();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);

// Setup Cipher and Streams
Cipher cipher_enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_enc.init(Cipher.ENCRYPT_MODE, key, iv);
Cipher cipher_dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_dec.init(Cipher.DECRYPT_MODE, key, iv);
CipherInputStream cipher_decIn = new CipherInputStream(socket.getInputStream(), cipher_dec);
CipherOutputStream cipher_encOut = new CipherOutputStream(socket.getOutputStream(), cipher_enc);

System.out.println("Ciphers initialized.");
ObjectInputStream objIn = new ObjectInputStream(cipher_decIn);
System.out.println("ObjectInputStream initialized.");
String message = (String) objIn.readObject();
System.out.println("Message from server: " + message);

//REMOVING THIS BLOCK WILL MAKE THE CODE WORK JUST FINE
ObjectOutputStream objOut = new ObjectOutputStream(cipher_encOut);
objOut.writeObject("Hello from Server!");
objOut.flush();

objIn.close();
objOut.close();
socket.close();
System.out.println("Client disconnected.");
}
}
В этом примере второй ObjectInputStream должен быть инициализирован после отправки первого сообщения, но каким-то образом добавление отмеченных блоков кода фактически нарушает код над ним. Я пробовал инициализировать все потоки перед отправкой любого типа данных, но это тоже не работает. Возможно, это просто фундаментальное непонимание того, как они должны вести себя, но я на грани. Я почти уверен, что проблема связана со вторым заголовком ObjectOutputStreams, который не доходит должным образом, возможно, из-за блоков CipherStreams или чего-то еще, но я просто не могу этого понять.
Редактировать: новые блоки ObjectInputStream() не имеют никакого отношения к этой проблеме. OutputStream инициализируется и должен отправить требуемый заголовок. Мне кажется, проблема в том, что заголовок не отправляется или не поступает должным образом из-за базового CipherInputStream/CipherOutputStream.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ient-and-s
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»