当我想使用socket发送对象时出现Java异常
我想做一个服务器-客户机应用程序,服务器将在其中等待对象,当服务器得到对象时,然后用它做一些事情。但当服务器想要获取对象时,我遇到了问题
服务器:
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);
}
}
}
}
客户:
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);
}
和服务器输出:
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)
客户端输出:
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
我能做错什么?或者,如果我的想法不好,有人能告诉我如何做得更好吗
# 1 楼答案
要序列化的对象,在通过网络发送时要执行的操作必须实现可序列化:http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
# 2 楼答案
错误信息非常清楚。CommandMessage类未实现可序列化。解决这个问题
# 3 楼答案
在循环中读取一个对象,但当客户端断开连接时,必须以某种方式处理异常,而不要从ObjectInputStream读取其他对象