Java Socket 卡在 new ObjectInputStream()

Mei*_*aft 0 java sockets serialization

我有一个游戏的服务器/客户端模型,但它一直卡在ObjectInputStream初始化中。

下面是客户端启动方法的代码:

public void start(){
try {
        Socket s = new Socket("127.0.0.1", 24680);
        Thread.sleep(1000);
        ois = new ObjectInputStream(s.getInputStream()); // stuck here
        oos = new ObjectOutputStream(s.getOutputStream());
        startGame();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

这是服务器代码:

try {
    InputStream fis = socket.getInputStream();
    ObjectInputStream ois = new ObjectInputStream(fis);
    while (true) {
        ArrayList < Dot > lists = (ArrayList < Dot > ) ois.readObject();
        for (Socket s: sockets) {
            ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
            oos.writeObject(lists);
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

use*_*421 8

你需要建造ObjectOutputStream ObjectInputStream在至少一端,最好是两个,以免发生意外。否则会new ObjectInputStream()阻止尝试读取对等方尚未写入的流标头new ObjectOutputStream(),因为他也被阻止new ObjectInputStream().

其他注意事项:

  • 与您当前的代码不同,您必须在套接字的整个生命周期内使用相同的对象流,在两端。原因是一样的:流头。如果您继续创建新的,ObjectOutputStreams您将继续编写新的流标头,这是对等方不会期望或理解的。
  • 删除sleep(). 网络代码中不需要睡眠。他们只是在浪费时间。Cargo-cult 编程。