【问题标题】:java initializing variable for stream in/outjava初始化流输入/输出的变量
【发布时间】:2011-02-06 17:09:01
【问题描述】:

下面的代码有问题。不清楚如何初始化 in/out 的变量。

在创建此对象期间,程序在构造函数中时挂起。它挂在this.inObjects = new ObjectIn......... 的行。我想创建这些输入/输出对象一次,仅通过在方法中调用它们并应用读写等来读取和写入输入/输出、字符串和对象

我哪里出错了?是否有可能因为不接收数据而挂起?他们不应该,对吧?

public class PokerClient 
{
    private PokerClientGui gui;
    private Socket clientSocket;
    private DataInputStream in;
    private DataOutputStream output;
    private ObjectInputStream inObjects;
    private ObjectOutputStream outObjects;
    private Hand hand;

    //constructor
    public PokerClient()
    {
        try
        {
            this.gui= gui;
            this.clientSocket = new Socket("localhost", 4444);
            this.in = new DataInputStream(this.clientSocket.getInputStream());
            this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream());
            this.output = new DataOutputStream(this.clientSocket.getOutputStream());
            this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream());
        }
        catch (Exception e)
        {
        }
}

【问题讨论】:

    标签: java objectinputstream datainputstream


    【解决方案1】:

    您应该始终首先创建对象输出流并刷新它。你永远不应该用两种不同的方式包装同一个流。永远不要捕获异常并忽略它,除非您喜欢出错并且无法确定哪里出了问题。不要给自己分配一个字段,这不会做任何有用的事情,只会让人们感到困惑。

    public class PokerClient {
      private final PokerClientGui gui;
      private final Socket clientSocket;
      private final ObjectOutputStream outObjects;
      private final ObjectInputStream inObjects;
    
      public PokerClient(PokerClientGui gui) throws IOException {
        this.gui = gui;
        clientSocket = new Socket("localhost", 4444);
        outObjects = new ObjectOutputStream(clientSocket.getOutputStream());
        outObjects.flush();
        inObjects = new ObjectInputStream(clientSocket.getInputStream());
      }
    }
    

    【讨论】:

    • 谢谢! (抱歉字段自动分配)我明天会试试这个!
    【解决方案2】:

    交换两行,即使用这个顺序:

    this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream());
    this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream());
    

    OIS的构造函数等待一些header,必须先发送,否则总是阻塞。

    【讨论】:

    • 我试图交换,但它再次挂起......相反,如果我评论它工作的所有行......即使我只留下第一个:this.in = new DataInputStream(this. clientSocket.getInputStream());它运行正常……是因为我在这部分程序中没有发送或接收任何东西吗?
    • DataInputStream 没有问题,只有 ObjectInputStream 阻塞,因为它需要一些输入。使用调试器或一些打印来找出它挂在哪里。我很确定我写的内容,因为我自己也遇到了这个问题,你可以在 Javadoc 的某个地方找到它。
    • 删除数据流,您也可以将对象流用于纯数据。 interface ObjectInput extends DataInput。但是,我看不出它如何在您的示例中引起问题。
    • +0:您说“您必须先发送”,但您的示例创建了第二个发送者。这不是很混乱吗?
    • 可能是这样,否则我可以写“交换两行”。我会改的。
    猜你喜欢
    • 2021-11-22
    • 2020-12-31
    • 2013-10-11
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多