Problem z serializacja obiektu w architekturze client serwer

Problem z serializacja obiektu w architekturze client serwer
P8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Siema wyrzuca mi wyjątek notSerializableException

Kod:
https://github.com/Prank866/Client-Serwer-ElGamalCipher

Próbowałem już chyba wszystkiego xD
Jakieś pomysły?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
2
Prank866 napisał(a):

Siema wyrzuca mi wyjątek notSerializableException

W coś więcej? No cały stał lub opis exceptiona? Nie tylko klasa musi implementować serializację, ale wszystkie pola też

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
2

Nie zmęczyłeś się synku ?
Ani pełnego wyjatku, ani nawet tipa, od czego zacząć czytać. BTW jak by dane pakietował poza Clientem i Serverem

miałem pisac o wszystkich polach - @KamilAdam mnie uprzedził

W obrębie jakiejś filzoofii "securitowej" to i owo może nie być Serialziable, oglądałem kiedyś taki projekt.

P8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

NO to już elegancko opisuje mianowicie:

problem dzieje się tutaj
screenshot-20220523193436.png

a wyrzucany wyjątek wygląda o tak :)

OD STRONY KLIENTA:

Połączono z serwerem
siema //wysyłam ciąg znakow do serwera
java.io.NotSerializableException: javax.crypto.Cipher
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1193)
at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1579)
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1536)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1444)
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1187)
at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:353)
at Klient.lambda$new$0(Klient.java:53)
at java.base/java.lang.Thread.run(Thread.java:832)
java.net.SocketException: Socket closed
at java.base/sun.nio.ch.NioSocketImpl.endRead(NioSocketImpl.java:248)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:327)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:981)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
at Klient.lambda$new$1(Klient.java:112)
at java.base/java.lang.Thread.run(Thread.java:832)

OD STRONY SERWERA:

Czekanie na połączenie od klienta ...
Klient Połączony
Czekaj Na wiadomosc od klienta!
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: javax.crypto.Cipher
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1719)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2540)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2434)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2235)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1712)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:519)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:477)
at Serwer.lambda$new$1(Serwer.java:104)
at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.io.NotSerializableException: javax.crypto.Cipher
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1193)
at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1579)
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1536)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1444)
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1187)
at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:353)
at Klient.lambda$new$0(Klient.java:53)
... 1 more

Jakieś gut aj di je ? :D

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
2

Tak, javax.crypto.Cipher nie implementuje Serializable, nie prześlesz tego tak

P8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

No popatrz to jak mógłbym sie dostać z serwera do obiektu który utworzyłem w kliencie?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1910
2
Prank866 napisał(a):

No popatrz to jak mógłbym sie dostać z serwera do obiektu który utworzyłem w kliencie?

Umieść kod serwera w kliencie. Na poważnie, to jakieś dziwne rzeczy próbujesz zrobić - po kablu przesyła się dane, a nie jakieś ciphery.

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3297
3

A co właściwie chcesz zrobić? Zaszyfrować przesyłane dane? Bo to co próbujesz zrobić, to przesłać obiekt do szyfrowania danych.

P8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Dokładnie chce przesłac obiekt konkretnie ten a ten obiekt zawiera dostęp do klucza który potrzebuje serwer aby odszyfrowac wiadomosc

Myśle że po prostu zaimplementuje swoja wlasna klase do szyfrowania bo tak to korzystałem z biblioteki własnir tej cipher

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
4
Prank866 napisał(a):

Dokładnie chce przesłac obiekt konkretnie ten a ten obiekt zawiera dostęp do klucza który potrzebuje serwer aby odszyfrowac wiadomosc

Myśle że po prostu zaimplementuje swoja wlasna klase do szyfrowania bo tak to korzystałem z biblioteki własnir tej cipher

Mam wrażenie, że nie zajarałeś.

Przesyła się dane, a nie obiekty "cznnościowe", funkcjonalne.

Tak ... z innego działu, zastanów się czy jest sens serialziwoania ... fabryki, socketa (choć podobno Chuck Norris nagrywa internet na dyskietkę)

piotrpo
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3297
6

Zakładając, że chodzi o handshake i wymianę kluczy, to wygeneruj sobie klucz przywatny, na jego podstawie wygeneruj publiczny, ten klucz publiczny przekształć do postaci strumienia bajtów i wyślij ten strumień na serwer. To co robisz, to tak jak byś próbował przesłać przez Internet nie wiadomość zaszyfrowaną Enigmą, tylko całą Enigmę.

P8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 33
0

Dziękuje wszystkim za pomysły koncząc temat

Ten Pan miał racje KamilAdam
"Tak, javax.crypto.Cipher nie implementuje Serializable, nie prześlesz tego tak"

Zostaje mi tylko zaimplementowac swoją klase szyfrującą w której będzie można przesłać klucz przez socket może to i dobrze zawsze więcej przygód 😁

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
0

Obiekt to taka chora istota co ma trochę danych a trochę czynności do wykonania. Można przesyłać dane, ale raczej nie przesyła się czynności — KamilAdam 2022-05-23 21:05

Dobrze wiem co to obiekt xD i co to pole i metody do wykonania :) Zapamietam ze nie przesyła sie obiektów — Prank866 2022-05-23 21:06

I tak, i nie.
Nie ma się co "obrażać na obiekty" i je jednak przysyłać - byle mądrze.

Warto wspomnieć, że na jednym poziomie "obiekt" to tak jak powyżej @KamilAdam , ale jak głębiej podłubiemy, to jest abstrakcja, która neguje istnienie runtime w którym on działa.

Przesyłało i się i przesyła "obiekty funkcjonalne", były applety Javy w przeglądarkach, są jakieś lambdy w cloudach (czy przerzuca się obrazy dockera). Ale to należy inaczej ujmować w ujęciu teoretycznym: przesyła się się kod (wykonywalny - nie źródłowy) do jakiegoś RUNTIME aby został wykonany.
W tym obcym runtime co do otoczenia danych, bardziej zależy od docelowego runtime, niż od danych związanych ze środowiskiem pochodzenia.
Owszem, prawdoidpobnie przesłany kod podejmie próbę nawiązania kontaktu z danymi "centralnymi" (konfiguracja sieci clouda, info które applet ma wyświetlić), ale banalny firewall może to uniemożliwić
Np Twoja "enigma": czyli klasa Cipher by była pusta, wyjeta z kartonu, bez magazynu kluczy

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.