创建ObjectInputStream对象时,程序停止

时间:2019-01-08 16:22:03

标签: java sockets objectoutputstream

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

服务器:

@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());正在等待未完成的事情?

1 个答案:

答案 0 :(得分:0)

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

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

解决方案非常简单-在服务器中,首先创建ObjectOutputStream,然后创建ObjectInputStream

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