简体   繁体   中英

Send object over socket

I'm trying to send a custome object through socket in java. I know that i need to put class that has object i need to send in same package, have the same serialVersionUID and implement Serializable. I have already did it but i still can't send object over socket. Where did i wrong ?
Here is client code:
Class user in client

package data;
import java.io.Serializable;

public class User implements Serializable {

    /**
     * 
     */
    public static final long serialVersionUID = 1L;
    private String username = null;
    private String hashedPassword = null;
    private Integer code = null;
    private String from = null;
    private String to = null;
    private Object data = null;

    public User() {

    }

    public User(Integer code) {
        this.code = code;
    }

    public User(Integer code, Object data) {
        this.code = code;
        this.data = data;
    }

    public User(String username, String hashedPassword, Integer code, String from, String to, Object data) {
        this.username = username;
        this.hashedPassword = hashedPassword;
        this.code = code;
        this.from = from;
        this.to = to;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }
    // other getters and setters
}

Code to send object of user class:

package tankclient;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import data.*;

public class Main {
    public static void main(String args[]) {
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        boolean isConnected = false;
        String ipServer = "localhost";
        int portServer = 4444;
        try {
            // Print("connecting to server...");
            socket = new Socket(ipServer, portServer);
            isConnected = true;
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            oos.writeObject(new User());
            // Print("connect server success");
        } catch (Exception ex) {
            isConnected = false;
            ex.printStackTrace();
        }
        // DataTransfer transfer = new DataTransfer();
        // //transfer.SendDataRequest(new DataRequest(3));
        // transfer.TestSend();
    }
}

Here is the code of server:
Code of user class: Exactly the same as user of client ( i copy from client and paste them into server )
Code of server to recieve user object:

package tankserver;

import data.*;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {

    public static void main(String args[]) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        boolean isConnected = false;
        int portServer = 4444;
        try {
            System.out.println("waiting for client to connect ...");
            serverSocket = new ServerSocket(portServer);
            socket = serverSocket.accept();
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
            isConnected = true;
            System.out.println("connected");
            User obj = (User) ois.readObject();
            System.out.println(obj.toString());
        } catch (Exception ex) {
            isConnected = false;
            ex.printStackTrace();
        }
        //DataTransfer transfer = new DataTransfer();

        //transfer.GetDataRequest();
        //transfer.TestRecieve();
    }

}

here is stacktrace i recieve ( in the server side ):

java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:209) at java.net.SocketInputStream.read(SocketInputStream.java:141) at java.net.SocketInputStream.read(SocketInputStream.java:223) at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2296) at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2476) at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2546) at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2448) at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1944) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1621) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) at java.io.ObjectInputStream.readObject(ObjectIn putStream.java:371) at tankserver.Main.main(Main.java:31) BUILD SUCCESSFUL (total time: 8 seconds)

when i try to debug then follow situation happen: when i put break point in client (server run normaly) and run step by step then it work but when i put break point in server ( client run normaly ) and run step by step then it throw exception in line 28 ois = new ObjectInputStream(socket.getInputStream());

I know that i need to put class that has object i need to send in same package

No, unless you mean 'same package as itself', which is trivial.

have the same serialVersionUID

Yes.

and implement Serializable.

Yes.

I have already did it but i still can't send object over socket. Where did I [go] wrong?

You didn't close the socket properly in the client class, so the connection got reset. Close the output stream instead of just flushing it.

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