Question

i want to make server client application, where server will waiting for object and when server get the object then make someting with it. But I have problem when server want to get the object.

Server:

public static void main(String[] argv) throws IOException {
    String command;
    List<Game> games = new ArrayList<>();
    List<Player> players = new ArrayList<>();

    serverSocket = new ServerSocket(9999);

    while(true){
        System.out.println("Waiting for player");
        Socket socket = serverSocket.accept();
        System.out.println("Player connected, waiting for command");

        ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
        System.out.println("Output created");

        Player p = new Player(out);
        players.add(p);
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
        System.out.println("input created");
        ServerReceiver receiver = new ServerReceiver(games, players, in);
        receiver.start();

    }
}

public class ServerReceiver extends Thread{

private List<Game> games;
private List<Player> players;
private ObjectInputStream in;

public ServerReceiver(List<Game> games, List<Player> players, ObjectInputStream in) throws IOException{
    this.games = games;
    this.players = players;
    this.in = in;
}

@Override
public void run(){
    CommandMessage message = null;
    System.out.println("in thread");
    while(true){
        try {
            message = (CommandMessage) in.readObject();

        } catch (IOException ex) {
            Logger.getLogger(ServerReceiver.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ServerReceiver.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

}

Client:

public static void main(String[] argv) throws IOException, ClassNotFoundException{
    socket = new Socket("localhost",9999);
    System.out.println("Connected");

    in = new ObjectInputStream(socket.getInputStream());
    Integer id = (Integer) in.readObject();
    System.out.println(id);
    out = new ObjectOutputStream(socket.getOutputStream());
    out.flush();

    CommandMessage m = new CommandMessage(0, 0, null);
    m.setName("Name");
    out.writeObject(m);

}

and server output:

Waiting for player
Player connected, waiting for command
Output created
input created
Waiting for player
in thread
III 16, 2014 12:24:20 DOP. Comunication.ServerReceiver run
SEVERE: null
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:   Comunication.CommandMessage
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1354)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at Comunication.ServerReceiver.run(ServerReceiver.java:40)
Caused by: java.io.NotSerializableException: Comunication.CommandMessage
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at Client.main(Client.java:37)

Client output:

Connected
0
Exception in thread "main" java.io.NotSerializableException: Comunication.CommandMessage
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at Client.main(Client.java:37)
Java Result: 1

What can I do wrong? or can somebody tell me how to do it better if my idea is not good?

Was it helpful?

Solution

You read an object in loop, but when client disconect you must somehow handle exception and do not read other object from ObjectInputStream

OTHER TIPS

The error message is perfectly clear. Your CommandMessage class doesn't implement Serializable. Fix that.

Objects that you want to serialize, what you are doing while sending it over the network have to implement Serializeable: http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top