Siema wyrzuca mi wyjątek notSerializableException
Kod:
https://github.com/Prank866/Client-Serwer-ElGamalCipher
Próbowałem już chyba wszystkiego xD
Jakieś pomysły?
Siema wyrzuca mi wyjątek notSerializableException
Kod:
https://github.com/Prank866/Client-Serwer-ElGamalCipher
Próbowałem już chyba wszystkiego xD
Jakieś pomysły?
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ż
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.
NO to już elegancko opisuje mianowicie:
problem dzieje się tutaj

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
Tak, javax.crypto.Cipher nie implementuje Serializable, nie prześlesz tego tak
No popatrz to jak mógłbym sie dostać z serwera do obiektu który utworzyłem w kliencie?
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.
A co właściwie chcesz zrobić? Zaszyfrować przesyłane dane? Bo to co próbujesz zrobić, to przesłać obiekt do szyfrowania danych.
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
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ę)
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ę.
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
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