简体   繁体   中英

Java sending HashMap through socket causes error

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM