Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我想使用套接字发送对象时出现Java异常_Java_Sockets_Objectinputstream_Objectoutputstream - Fatal编程技术网

当我想使用套接字发送对象时出现Java异常

当我想使用套接字发送对象时出现Java异常,java,sockets,objectinputstream,objectoutputstream,Java,Sockets,Objectinputstream,Objectoutputstream,我想做一个服务器-客户机应用程序,服务器将在其中等待对象,当服务器得到对象时,然后用它做一些事情。但当服务器想要获取对象时,我遇到了问题 服务器: public static void main(String[] argv) throws IOException { String command; List<Game> games = new ArrayList<>(); List<Player> players = new Array

我想做一个服务器-客户机应用程序,服务器将在其中等待对象,当服务器得到对象时,然后用它做一些事情。但当服务器想要获取对象时,我遇到了问题

服务器:

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);
        }

    }
}
和服务器输出:

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

我能做错什么?或者,如果我的想法不好,有人能告诉我如何做得更好吗?

错误信息非常清楚。CommandMessage类未实现可序列化。修复此问题。

您在循环中读取一个对象,但当客户端断开连接时,您必须以某种方式处理异常,并且不从ObjectInputStream读取要序列化的其他对象,通过网络发送时所做的操作必须实现可序列化:

错误消息表示您尝试发送的对象不可序列化,因此您可以添加
CommandMessage
的代码,因为这是您似乎要发送的类吗?第一个问题:
是否实现了Serializable
?我添加了Serializable,客户端错误消失,但仍然存在服务器错误,所以现在对服务器执行相同的操作我添加Serializable,但仍然存在此异常:
严重:java.io.ObjectInputStream$BlockDataInputStream.peekByte处的null java.io.EOFEException(ObjectInputStream.java:2598)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1318)在com.ServerReceiver.run(ServerReceiver.java:40)的java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)上
这是一个新问题,但它只是意味着您试图在读取循环中读取流的末尾。捕获EOFEException并在获得它时关闭和中断。这并没有回答所问的问题。它回答了在对我的答案的评论中提出的一个问题,我在13小时前已经回答了这个问题。
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