【问题标题】:Java Socket stuck at new ObjectInputStream() [duplicate]Java Socket 卡在 new ObjectInputStream() [重复]
【发布时间】:2015-10-05 00:22:53
【问题描述】:

我有这个用于游戏的服务器/客户端模型,但它一直卡在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();
}

提前致谢!

【问题讨论】:

  • netstat 是否显示连接?创建服务器套接字的服务器代码在哪里?这里没有足够的信息来提供帮助。
  • 会不会是网络连接问题?尝试先使用 telnet 连接到您的服务器。
  • 你在这方面做了三件事。只有其中一个是正确的。您被new ObjectInputStream() 屏蔽,而不是getInputStream()new ObjectOutputStream().
  • @JimGarrison 如果没有连接,也不会有Socket
  • 提供定义服务器套接字和套接字集合的完整代码。

标签: java sockets serialization


【解决方案1】:

你需要构造ObjectOutputStreambeforeObjectInputStream至少一端,最好两者兼而有之,以免发生意外。否则new ObjectInputStream()会阻止试图读取对等体的new ObjectOutputStream()尚未写入的流头,因为他也被new ObjectInputStream().阻止了

其他说明:

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

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多