I tried to send HashMap using socket(Client, Server) but I got some errors while sending message Client -> Server.
This is error from Client:
java.io.NotActiveException: not in readObject invocation or fields already read
at java.base/java.io.SerialCallbackContext.checkAndSetUsed(SerialCallbackContext.java:72)
at java.base/java.io.SerialCallbackContext.getObj(SerialCallbackContext.java:55)
at java.base/java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:444)
at java.base/java.util.HashMap.writeObject(HashMap.java:1494)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1201)
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1526)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1448)
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
at application.Main$2.run(Main.java:85)
java.lang.NullPointerException: Cannot invoke "java.io.SerialCallbackContext.setUsed()" because "this.curContext" is null
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1530)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1448)
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1191)
at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
at application.Main$2.run(Main.java:85)
This one is error from Server:
java.io.InvalidClassException: javaa..uuttiill..; enum descriptor has non-zero serialVersionUID: 5189562781749417568
at java.base/java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:824)
at java.base/java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:988)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2034)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1909)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2235)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1744)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:514)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:472)
at Client$1.run(Client.java:37)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Client code
public class Main extends Application {
static Socket connection;
String ip = "127.0.0.1";
int port = 8888;
public ObjectInputStream input;
public ObjectOutputStream output;
public Controller controller;
public void startClient(String ip, int port) {
try {
connection = new Socket(ip, port);
output = new ObjectOutputStream(connection.getOutputStream());
input = new ObjectInputStream(connection.getInputStream());
System.out.println("Stream connected");
} catch (Exception error) {
error.printStackTrace();
}
}
public void send(HashMap<String, String> freight) {
Thread thread = new Thread() {
public void run() {
try {
output.writeObject(freight); // ERROR HERE
output.flush();
System.out.println(freight.get("act") + " sended");
} catch (Exception error) {
error.printStackTrace();
}
}
};
thread.start();
}
public void start(Stage primaryStage) {
startClient("", 8888);
var serverCommand = new HashMap<String, String>();
serverCommand.put("act", "create");
serverCommand.put("roomType", "justchat");
serverCommand.put("roomName", "chat room");
send(serverCommand); // send server to create chat room
}
public static void main(String[] args) throws InterruptedException {
launch(args);
}
}
Server (Class that connects to client from server)
public class Client {
Socket connection;
public ObjectInputStream input;
public ObjectOutputStream output;
Client(Socket connection) throws IOException {
this.connection = connection; // get socket connected to client from server main
output = new ObjectOutputStream(connection.getOutputStream());
input = new ObjectInputStream(connection.getInputStream());
recv();
}
public void recv() {
Runnable thread = new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
System.out.println("listening to " + connection.getInetAddress());
try {
while (true) {
var freight = (HashMap<String, String>) input.readObject(); // ERROR HERE
System.out.println(freight.get("act") + " received");
}
} catch (Exception error) {
error.printStackTrace();
}
}
};
Server.threadPool.submit(thread); // Server is server main class
}
}
Maybe you need to wrap the serialized with a class that has serialversion uuid
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.