0

我对以下代码有疑问。目前尚不清楚如何初始化输入/输出变量。

在创建此对象期间,程序在构造函数中时挂起。它挂在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)
        {
        }
}
4

2 回答 2

2

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

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());
  }
}
于 2011-02-06T19:31:59.130 回答
1

交换两行,即使用以下顺序:

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

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

于 2011-02-06T17:23:53.797 回答