2015-05-31 3 views
0

Я попытался подытожить свой вопрос, но на самом деле это еще больше. Для задания в универе мы должны создать два конструктора (английский не мой первый язык)Как написать объекты через ObjectOutputStream, когда объекты создаются в другом классе?

1) публичное SecureInputStream (InputStream база, OutputStream удаленный)

2) общественное SecureOutputStream (OutputStream база, InputStream удаленный)

1) предполагается создать BigIntegers г, п, к, то сгенерировать открытый ключ K=g^k mod n, а затем отправить g, n и k с помощью пульта дистанционного управления к другой стороне, после чего она, предполагают, чтобы прочитать другие стороны k и создайте секрет s= k^k mod n и запустите t он случайный генератор с ним. Я должен переопределить write(int b), поэтому запись будет шифровать s, используя метод xor из класса BigInteger, а затем отправить его через удаленный доступ с другой стороны.

2) предполагается ожидать g.n от 1), создать его собственный k, а затем отправить его обратно с помощью пульта дистанционного управления. Конструктор также инициирует случайный генератор, используя секрет s

Наш инструктор дал нам два «простых» класса клиентов и серверов, которые используют Socket, Port Situation. Моя проблема заключается в том, что у каждого класса есть собственный поток ввода/вывода, который читает/пишет что-то. Как мне попасть туда, и что еще более важно, где черт делает информацию, которая отправляет землю, когда она читается? В течение двух дней все, что я делаю, это чтение в Интернете и просмотр учебников. Я определенно понял, что такое потоки, хотя я не могу понять, как они работают.

Как я могу отправить несколько вещей через этот поток? Как другая сторона знает, что из того, что я посылаю? Как отправить материал вообще?

Я надеюсь, что кто-то может мне помочь. Ну вот код, который я до сих пор, основной метод от нашего инструктора. Представьте, что я сделал весь импорт.

//Error Method: Invalid method declaration, return type missing, 
//I'm guessing the constructor needs to sit in a class called 
//SecureInputStream, but how can I use the stuff in the class Client 
//when the constructor I need is in another? 

public SecureInputStream(InputStream base, OutputStream remote) { 
    super(); 
    //g,n,k,s are created 
    BigInteger g = BigInteger.probablePrime(1024, new SecureRandom()); 
    BigInteger n = BigInteger.probablePrime(1024, new SecureRandom()); 
    BigInteger k = BigInteger.probablePrime(1024, new SecureRandom()); 
    BigInteger s = BigInteger.probablePrime(1024, new SecureRandom()); 
    Random r = new Random(); 
    r.nextInt(); 
    BigInteger exponent1 = new BigInteger("r"); 
    BigInteger exponent2 = new BigInteger("k"); 
    k = g.modPow(exponent1, n); 
    s = k.modPow(exponent2, n); 

} 

public static void main(String... args) { 

    Socket server = null; 

    try { 
     // Connect to server on local machine ("localhost") and port 3145. 
     server = new Socket("localhost", 3145); 

     // Get input stream from server and read its message 
     Scanner in = new Scanner(server.getInputStream()); 
     // If we need to send messages to the server: 
     // OutputStream out = server.getOutputStream(); 

     while (in.hasNext()) { 
      System.out.println(in.nextLine()); 
     } 
     in.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (server != null) { 
       server.close(); 
      } 
     } catch (IOException e) { 

     } 
    } 
} 
+4

Удовлетворительный факт: каждый раз, когда программист пишет пустое предложение 'catch', медведь-панда умирает. – GabrielOshiro

+0

Просто подскажите - проверьте исходный код Java BufferedinputStream/BufferdOutputStream. Если вы не решите свое упражнение, но оно демонстрирует шаблон Decorator. Вот как вы «проходите» между существующими потоками ... вы этого не делаете! Вы их обертываете. Например, базовый OutputStream вашего сервера отлично справляется с передачей необработанных байтов. Так пусть будет. Просто оберните его безопасным потоком вывода, который будет получать данные для записи(), перевести его в зашифрованные необработанные байты, а затем вставить эти необработанные байты в основной поток. –

+0

(продолжение) Есть некоторые более тонкие моменты, которые у меня нет времени, чтобы рассмотреть насквозь. Например. начальное рукопожатие (обмен ключами), которое вы могли бы выполнять на конструкторах, или, возможно, лениво при первом чтении/записи. И, например, Я не уверен, почему ваши защищенные потоки получают 2 параметра конструктора (inputStream и OutputStream) ... –

ответ

1

Как я пишу объекты через ObjectOutputStream,

Вы называете ObjectOutputStream.writeObject().

  • 2-й вопрос, который вы не спросить: как я могу читать объекты через ObjectInputStream?

Вы называете ObjectInputStream.readObject().

  • 3-й вопрос, который вы не спросить: как я могу обнаружить тип входящего объекта?

Вы можете узнать тип полученного объекта с помощью оператора instanceof. Но с большинством протоколов, включая описанный вами протокол, вам не нужно это делать. Обычно протокол определяет, что отправляется, поэтому все, что вам нужно сделать, читается соответственно.

Когда объекты создаются в другом классе?

Не имеет значения, где были созданы объекты.

+0

... кроме случаев, когда они созданы в разных Java-режимах. Классы во время выполнения должны быть совместимы. Лично я предпочел бы придумать протокол и использовать 'BigInteger.toByteArray()'. Однако для назначения потоки объектов должны быть достаточными. –

+0

@MaartenBodewes Вопрос: «Как написать объекты через ObjectOutputStream, когда объекты создаются в другом классе?» Объект, который должен быть записан в ObjectOutputStream, должен быть создан в той же JVM. – EJP

+0

Эх, конечно. Просто поток объектов должен быть прочитан совместимым временем выполнения. Я не признаю недействительным ответ, я просто добавил немного предупреждения, если кто-то использует его для общего протокола - объекты отправляются через сокет, который знает, где они находятся. –

Смежные вопросы