0

I have a class name player

public JLabel imagen;

public String Nombre;

public Player(int x, int y, int width, int height, Icon icono, String name){
    imagen = Player(x, y, width, height, icono);
    Nombre = name;
}
public JLabel Player(int x, int y, int width, int height, Icon icono){
    JLabel imagen = new JLabel(icono);
    imagen.setLocation(x, y);
    imagen.setSize(width, height);
    return imagen;
}

(It is for creating a new player)

I also have a client class:

public class Cliente implements Runnable {

    String host;
    int puerto;
    Player mensaje;

public Cliente(int purto, Player mensaje, String host){
    this.puerto = purto;
    this.mensaje = mensaje;
    this.host = host;
}
@Override
public void run() {
    DataOutputStream out;

    try {
        Socket sc = new Socket(host, puerto);
        out = new DataOutputStream(sc.getOutputStream());
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
        
        objectOutputStream.writeObject(mensaje);
        
        sc.close();

    } catch (IOException ex) {
        System.out.println(ex);
    }
}
}

And im using objectOutputStream but it says that it

"java.io.NotSerializableException: objects.Player"

And I want to send my player to the server but it says that exception!

Also if you need here is the server class

public class Servidor extends Observable implements Runnable {

    int puerto;

public Servidor(int puerto) {
    this.puerto = puerto;
}

@Override
public void run() {
    ServerSocket servidor = null;
    Socket sc = null;
    DataInputStream in;

    try {
        servidor = new ServerSocket(puerto);
        System.out.println("server started");

        while (true) {
            sc = servidor.accept();

            in = new DataInputStream(sc.getInputStream());
            ObjectInputStream input = new ObjectInputStream(in);

            Player players = null;
            try {
                players = (Player) input.readObject();
                System.out.println(players.Nombre);
            } catch (ClassNotFoundException ex) {
            }

            this.setChanged();
            this.notifyObservers(players);
            this.clearChanged();

            sc.close();
        }
    } catch (IOException ex) {
    }
}
}

and also if you want here are the lines of code that send the request to the client class

    Cliente c = new Cliente(5000, new Player(x, y, width, height, icon, "name of the player"), "the ip");
    Thread t = new Thread(c);

    t.start();

1 Answer 1

2

Looks like you forgot to make the Player object Serializable, thus code is throwing java.io.NotSerializableException

If you need to send some object over network then the object need to be Serializable.

Serialization is the process of taking the memory data structure of an object and encoding it into a serial (hence the term) sequence of bytes. This encoded version can then be saved to disk, sent across a network connection, or otherwise communicated to a recipient. (from Wikipedia.org)

I have updated the code

Player.java

import java.io.Serializable;

import javax.swing.Icon;
import javax.swing.JLabel;

public class Player implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public JLabel imagen;

    public String Nombre;

    public Player(int x, int y, int width, int height, Icon icono, String name) {
        imagen = Player(x, y, width, height, icono);
        Nombre = name;
    }

    public JLabel Player(int x, int y, int width, int height, Icon icono) {
        JLabel imagen = new JLabel(icono);
        imagen.setLocation(x, y);
        imagen.setSize(width, height);
        return imagen;
    }
}

Cliente.java

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class Cliente implements Runnable {

    String host;
    int puerto;
    Player mensaje;

    public Cliente(int purto, Player mensaje, String host) {
        this.puerto = purto;
        this.mensaje = mensaje;
        this.host = host;
    }

//  @Override
    public void run() {
        DataOutputStream out;

        try {
            Socket sc = new Socket(host, puerto);
            out = new DataOutputStream(sc.getOutputStream());
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);

            objectOutputStream.writeObject(mensaje);

            sc.close();

        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    public static void main(String[] args) {
        Cliente c = new Cliente(5000, new Player(1, 2, 3, 4, null,
                "Holis Studios"), "localhost");
        Thread t = new Thread(c);

        t.start();
    }
}

Servidor.java

import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Observable;

public class Servidor extends Observable implements Runnable {

    int puerto;

    public Servidor(int puerto) {
        this.puerto = puerto;
    }

//  @Override
    public void run() {
        ServerSocket servidor = null;
        Socket sc = null;
        DataInputStream in;

        try {
            servidor = new ServerSocket(puerto);
            System.out.println("server started");

            while (true) {
                sc = servidor.accept();

                in = new DataInputStream(sc.getInputStream());
                ObjectInputStream input = new ObjectInputStream(in);

                Player players = null;
                try {
                    players = (Player) input.readObject();
                    System.out.println(players.Nombre);
                } catch (ClassNotFoundException ex) {
                }

                this.setChanged();
                this.notifyObservers(players);
                this.clearChanged();

                sc.close();
            }
        } catch (IOException ex) {
        }
    }
    
    public static void main(String[] args) {
        Servidor server = new Servidor(5000);
        Thread t = new Thread(server);

        t.start();
    }
}

Compiling the code:

javac.exe -cp . Player.java

javac.exe -cp . Servidor.java

javac.exe -cp . Cliente.java

Run:

java.exe -cp . Servidor
server started

java.exe -cp . Cliente

Output appearing on Servidor console:

server started
Holis Studios
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.