3

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(ObjectInputStream.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());

  • "Connection reset" generally indicates a network problem. – Wyzard May 22 '16 at 05:48
  • Thanks for posting a complete, compilable example. I took your code and ran it in Eclipse and it worked without throwing any exceptions. Something about your networking configuration is getting in the way. Have you tried stepping through the code in your debugger? – Jim Garrison May 22 '16 at 05:48
  • @Wyzard It generally indicates an application protocol problem. – user207421 May 22 '16 at 05:49
  • @JimGarrison I haven't done it but when i use String class instead of user it work so i think it's not a network problem. i will try debug. thank you :) –  May 22 '16 at 06:08
  • Oh strange: 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 i throw exception in line 28 ois = new ObjectInputStream(socket.getInputStream()); @JimGarrison do you know why is that ? –  May 22 '16 at 06:27
  • i didn't flush data so it didn't work. thank to ejp :) –  May 22 '16 at 06:34
  • @oopaewem Correction: you didn't close the socket. No flush necessary. – user207421 May 22 '16 at 07:49

1 Answers1

0

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.

user207421
  • 305,947
  • 44
  • 307
  • 483
  • The socket will get closed when the client ends. The code runs fine in Eclipse so something else is wrong. – Jim Garrison May 22 '16 at 05:50
  • @JimGarrison No. It depends on the platform. Windows will reset the connection. Unixen will close the socket properly. OP's problem is the evidence. The code 'runs fine' in *your* Eclipse* on *your* platform. – user207421 May 22 '16 at 06:03
  • which happens to be win7 – Jim Garrison May 22 '16 at 06:05
  • @JimGarrison Fails for me in Netbeans JDK 1.8 Winfows 7 Pro. Works for the OP if he adopts this fix. Curious really. – user207421 May 22 '16 at 07:47