Java Socket卡在新的ObjectInputStream()

时间:2015-10-05 00:22:53

标签: 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();
    }
}
}

这是服务器代码:

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

您需要至少在一端 ObjectOutputStream之前构建ObjectInputStream ,最好是两者都是为了避免发生意外。否则new ObjectInputStream()阻止尝试读取对等方的new ObjectOutputStream()尚未写入的流标题,因为他也在new ObjectInputStream().

中被阻止

其他说明:

  • 与当前代码不同,您必须在套接字的生命周期中使用相同的对象流。原因是相同的:流标题。如果你不断创建新的ObjectOutputStreams,你将继续编写新的流标题,这是同行不会期望或理解的。
  • 删除sleep()。网络代码中不需要睡眠。他们只是浪费时间。货物崇拜节目。