【问题标题】:Program pauses on initializing object input stream in Java程序在 Java 中初始化对象输入流时暂停
【发布时间】:2013-01-11 03:39:44
【问题描述】:

在运行调试器时,程序暂停从服务器主输入输出流初始化对象流。以下是代码:

 public TFileReader(Client cli)throws Exception{
    this.cli = cli;
    fileSock = new Socket(cli.ServerIp(), cli.FilePort());
    fobjIn = new ObjectInputStream(fileSock.getInputStream());
    fobjOut = new ObjectOutputStream(fileSock.getOutputStream());
    fobjOut.flush();

}

 @Override
public void run(){

    try{
            System.out.println("file reader thread online");

            fobjOut.writeObject(cli.Name());
            fobjOut.flush();
           String per = (String) fobjIn.readObject();
            System.out.println(per+"video filing...");
            if(!per.equals("OKF"))
            {
                    throw new Exception("Error In retriving video.");
            }

它在fobjIn 处暂停并且不去执行fobjOut 尽管fobjIn 它从fobjIn 断点传递但不命中断点。

【问题讨论】:

  • 顺便说一句,您应该始终首先创建并刷新您的 ObjectOutputStream。如果你不这样做,两端可能会死锁,每个等待从另一个读取。
  • 实际上我在设置类构造函数之后就在 put 流中初始化对象 thwn hoq 我刷新它 qhen 它是第一次初始化。?你能告诉我哪里错了

标签: java sockets stream objectinputstream


【解决方案1】:

我会像这样保持简单

public TFileReader(Client cli) throws IOException {
    this.cli = cli;
    socket = new Socket(cli.ServerIp(), cli.FilePort());
    out = new ObjectOutputStream(socket.getOutputStream());
    out.flush();
    in = new ObjectInputStream(socket.getInputStream());
}

public void writeObject(Object o) throw IOException {
    out.writeObject(o);
    out.reset();
    out.flush();
}

public <T> T readObject() throw IOException {
    return (T) in.readObject();
}

public void close() throws IOException {
    in.close();
    out.close();
    socket.close();
}

【讨论】:

  • 请再次检查我编辑的代码,但我面临与上述相同的问题
  • 正如我之前所说,You should always create and flush your ObjectOutputStream first.
【解决方案2】:

问题在于 ObjectInputStream 在初始化时预读取数据。

首选的解决方案是Java Creating a new ObjectInputStream Blocks:始终在初始化您的 ObjectInputStream 之前初始化您的 ObjectOutputStream,以便可以启动两者内部使用的“握手”。

当您无法控制所有代码并且无法更改顺序时,请考虑延迟 OIS 初始化直到数据可用(InputStream.available 或在包装它的缓冲流上标记/读取/重置等)。

【讨论】:

  • 请不要使用available(),它不能解决任何问题。
  • @mihai 我也在服务器端使用对象流,并从那里发送来自 objectouputstream 的数据。
  • 您忽略了一种可靠的解决方案,而支持几种最可疑的解决方法。 -1
  • @jtahlborn available() 是否不能很好地表明 ObjectOutputStream 已在另一端创建?
  • @EJP 谢谢你的笔记。我已经更新了答案,以更突出地显示首选解决方案。我相信 ObjectInputStream 初始化的延迟也有效——过去它对我有用——而且我没有立即看到警告。您能否详细说明对这种方法的担忧?
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多