I try to use ObjectInputStream and ObjectOutputStream in my Java project but the object I want to send on the network contains other objects than String, int, boolean etc... so it does not work when I try to deserialize it. Do you know other alternatives to send objects that contains other objects?
Here is the class I want to send:
public class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = -8308312587789563412L;
private String ip;
private Player player;
public People(Player player, String ip) {
this.player = player;
this.ip = ip;
}
public void walk() {
System.out.printf("%s is walking...\n", player.getName());
}
public Player getPlayer() {
return player;
}
public String getIp() {
return ip;
}
}
Here is the class where I send the object:
public class ServerMulticast {
final int gamePort = 5000;
private People p1;
private People p2;
ServerSocket socketserver;
Socket socketduserveur;
public ArrayList<People> run(Player player) {
//Address
String multiCastAddress = "225.6.7.8";
final int multiCastPort = 3456;
System.setProperty("java.net.preferIPv4Stack", "true");
try {
InetAddress group = InetAddress.getByName(multiCastAddress);
MulticastSocket socket = new MulticastSocket(multiCastPort);
//String message = pseudo + " is waiting for a second player...";
p1 = new People(player, InetAddress.getLocalHost().getHostAddress());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(p1);
oos.flush();
byte[] data = baos.toByteArray();
//Send data
DatagramPacket packet = new DatagramPacket(data, data.length, group, multiCastPort);
socket.send(packet);
socket.close();
recieveIpAdress();
System.out.printf("%s just joined the game. (ip:%s)\n", p2.getPlayer().getName(), p2.getIp());
//Play
p2.walk();
p1.walk();
} catch (Exception e) {
e.printStackTrace();
}
ArrayList<People> peoples = new ArrayList<>();
peoples.add(p1);
peoples.add(p2);
return peoples;
}
private void recieveIpAdress() {
if(p2 == null) {
try {
//Créer un socket serveur avec un numéro de port 5000
socketserver = new ServerSocket(gamePort);
//ecoutes pour une connexion a apporter a ce socket et l'accepte
socketduserveur = socketserver.accept();
// get the input stream from the connected socket
InputStream inputStream = socketduserveur.getInputStream();
// create a DataInputStream so we can read data from it.
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
//read the list of messages from the socket
p2 = (People) objectInputStream.readObject();
socketserver.close();
socketduserveur.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
And here is the class where I recieve it:
public class ClientMulticast {
private People p1 = null;
private People p2 = null;
public ArrayList<People> run(Player player) {
Scanner sc = new Scanner(System.in);
String multiCastAddress = "225.6.7.8";
final int multiCastPort = 3456;
final int bufferSize = 1024 * 4; // Maximum size of transfer object
try {
p1 = new People(player, InetAddress.getLocalHost().getHostAddress());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.setProperty("java.net.preferIPv4Stack", "true");
try {
InetAddress group = InetAddress.getByName(multiCastAddress);
MulticastSocket mSocket = new MulticastSocket(multiCastPort);
mSocket.joinGroup(group);
boolean bSelectServer = false;
while (bSelectServer == false) {
System.out.println("\nWating for players to host games...");
byte[] buffer = new byte[bufferSize];
DatagramPacket packet = new DatagramPacket(buffer, bufferSize, group, multiCastPort);
mSocket.receive(packet); // waits until it recieved a packet
System.out.println("Player found!");
// Deserialze object
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
ObjectInputStream ois = new ObjectInputStream(bais);
try {
People readObject = (People) ois.readObject();
if (readObject instanceof People) {
p2 = (People) readObject;
System.out.printf("Do you want to connect to %s's game (ip:%s)? (true/false)\n", p2.getPlayer().getName(),
p2.getIp());
try {
bSelectServer = sc.nextBoolean();
} catch (Exception e) {
System.out.println("ERROR! Your input is not a boolean.");
}
} else {
System.out.println("The received object is not of type People!");
}
} catch (Exception e) {
System.out.println("No object could be read from the received UDP datagram.");
}
}
mSocket.close();
sendIpAdress();
System.out.printf("You just joined %s's game\n", p2.getPlayer().getName());
// Play
p1.walk();
p2.walk();
} catch (Exception e) {
e.printStackTrace();
}
ArrayList<People> peoples = new ArrayList<>();
peoples.add(p1);
peoples.add(p2);
return peoples;
}
private void sendIpAdress() {
Socket socketClient;
try {
socketClient = new Socket(p2.getIp(), 5000);
// get the output stream from the socket.
OutputStream outputStream = socketClient.getOutputStream();
// create an object output stream from the output stream so we can send an
// object through it
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(p1);
objectOutputStream.flush();
// Close socket
socketClient.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}