2015-10-31 36 views
1

我无法从套接字获取输入和输出流,每次到达getInputStream/getOutputStream时,都会显示我的代码块。ObjectInputStream在Java线程中失败

class Connection implements Runnable { 
    private static final Logger logger = Logger.getLogger(Connection.class.getName()); 
    Socket connection = null; 
    Boolean serverIsDown = false; 
    Thread thread = null; 
    ObjectInputStream ois = null; 
    ObjectOutputStream oos = null; 
    Context ctx = null; 

    public Connection(Socket accept, Boolean serverIsDown) { 
     logger.log(Level.INFO, "Connected" + accept.getRemoteSocketAddress()); 
     this.connection = accept; 
     this.serverIsDown = serverIsDown; 

     this.thread = new Thread(this, "Client Connection"); 
     this.thread.start(); 

    } 

    public void init() throws IOException { 
     while (true) { 
      System.out.println("Hit enter to send object"); 
      System.in.read(); 
      Request request = new Request(); 
      oos.writeObject(request); 
     } 
    } 

    @Override 
    public void run() { 
     try { 
      this.ois = new ObjectInputStream(this.connection.getInputStream()); //Blocks here 
      this.oos = new ObjectOutputStream(this.connection.getOutputStream()); 
      this.init(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

当它阻塞时没有输出错误。

+1

始终平齐()用ObjectOutputStream创建ObjectInputStream的之前。这是因为格式有一个ObjectInputStream在构造函数中读取的头。 –

回答

2

如所提到的文档: http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#ObjectInputStream(java.io.InputStream)

创建一个的ObjectInputStream从指定的InputStream读取。 从流中读取序列化流头并进行验证。此构造函数将会阻塞,直到相应的ObjectOutputStream写入并刷新标头

我建议你使用两个线程处理来自接受套接字的输入和输出流,以避免阻塞。另一种更好的方法是使用线程池和一些异步io(ex; selector),而不是为每个接受的套接字分配一个线程。

还参考以下的其它后: new ObjectInputStream() blocks