【问题标题】:The program stops when the ObjectInputStream object is created [duplicate]创建 ObjectInputStream 对象时程序停止[重复]
【发布时间】:2019-06-03 09:08:16
【问题描述】:

我在服务器和客户端有两种方法:

服务器:

@Override
    public void start(Stage primaryStage) throws Exception {
        socket = new Socket("localhost", 9998);
        System.out.println("connected");
        input = new ObjectInputStream(socket.getInputStream());
        System.out.println("1");
        output = new ObjectOutputStream(socket.getOutputStream());

        output.writeObject(new Message(CONFIG, "ping"));

        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/window/fxmls/window.fxml"));
        loader.setController(this);
        AnchorPane anchorPane = loader.load();
        Scene scene = new Scene(anchorPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

客户:

@Override
    public void run() {
        try {
            serverSocket = new ServerSocket(9998);
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("connected");
                input = new ObjectInputStream(socket.getInputStream());
                System.out.println(1);
                output = new ObjectOutputStream(socket.getOutputStream());
                Message message = (Message) input.readObject();
                if (message.getHeader() == CONFIG && message.getMessage().equals("ping")) {
                    System.out.println(message.getMessage());
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

当客户端开始运行时,使用 ObjecInputStream 发送检查消息"ping",但上述方法中的代码在System.out.println(1); 上停止我不知道为什么。之前类似的代码都在运行。我做错了什么? input = new ObjectInputStream(socket.getInputStream()); 正在等待我没有做的事情?

【问题讨论】:

    标签: java sockets objectoutputstream


    【解决方案1】:

    你在这里基本上陷入了僵局。如果您先启动服务器,它将开始侦听端口 9998 上的连接。当您启动客户端时,它会与服务器建立连接。服务器接受连接,并尝试创建一个ObjectInputStreamObjectInputStream 构造函数(和服务器线程)将阻塞,直到它可以从客户端(客户端尚未发送)读取流标头。所以服务器没有到达创建ObjectOutputStream 的地步(这会导致数据被发送到客户端)。

    同时,客户端正在尝试创建ObjectInputStream 并将阻塞,因为服务器尚未发送任何数据。结果是在ObjectInputStream 构造函数中阻塞了两个线程。

    解决方案很简单——在服务器中,先创建ObjectOutputStream,再创建ObjectInputStream

    socket = new Socket("localhost", 9998);
    output = new ObjectOutputStream(socket.getOutputStream());
    input = new ObjectInputStream(socket.getInputStream());
    

    【讨论】:

    • 我按照你说的做了,但是output.writeObject(new Message(CONFIG, "ping")); 做错了:Exception in thread "main" java.lang.reflect.InvocationTargetException
    • 您应该为此创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2013-06-20
    • 2017-04-18
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多