在java中从socket获取输入和输出流的问题

时间:2011-08-05 19:38:09

标签: java sockets

我调试了程序并观察到当它想要从socket获取输入流时停止:

public Chat(Socket s) throws IOException {
        input = new ObjectInputStream(s.getInputStream()); // stopped here 
        output = new ObjectOutputStream(s.getOutputStream());
        initComponents();
    }

我在调用上面的构造函数之前关闭了开放流和套接字:

Socket socket = listeningSocket.accept();
disconnect();
Chat c = new Chat(socket);

这是断开方法:

private void disconnect() throws IOException {
        input.close();
        output.close();
        client.close();
    }

输入,输出和客户端在这里启动:

    client = new Socket(chatServer, chatPort);
    input = new ObjectInputStream(client.getInputStream());
    output = new ObjectOutputStream(client.getOutputStream());

这是程序暂停时的堆栈跟踪:

Thread [main] (Suspended)   
    SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]    
    SocketInputStream.read(byte[], int, int) line: 146  
    ObjectInputStream$PeekInputStream.read(byte[], int, int) line: 2282 
    ObjectInputStream$PeekInputStream.readFully(byte[], int, int) line: 2295    
    ObjectInputStream$BlockDataInputStream.readShort() line: 2766   
    ObjectInputStream.readStreamHeader() line: 797  
    ObjectInputStream.<init>(InputStream) line: 297 
    Chat.<init>(Socket) line: 20    
    Client$5.run() line: 310    
    Client.clientListen() line: 320 
    Client.access$7(Client) line: 302   
    Client$6.run() line: 350    
    Client.main(String[]) line: 352 

请帮忙 谢谢:))

2 个答案:

答案 0 :(得分:2)

来自ObjectInputStream's constructor的文档:

  

此构造函数将阻塞,直到相应的ObjectOutputStream为止   写了并刷了头。

是否有任何东西从另一端写入套接字?你是在冲洗另一端的溪流吗?

ObjectOutputStream的构造函数有文档说明用户可能希望刷新到流,以便输入流不会阻塞。

答案 1 :(得分:0)

是否在特定或可能在构造函数内部,甚至在s.getInputStream()调用内停止在该行上?构造函数和getInputStream()都可以抛出IOException。

不要强调这一点,但是在调试它时是否跳转到了构造函数调用和getInputStream()方法?

就像Atreys上面所说,看到堆栈跟踪可能会有用。