Проблема получения входного и выходного потока из сокета в Java - PullRequest
2 голосов
/ 05 августа 2011

Я отладил программу и заметил, что она останавливается, когда она хочет получить поток ввода из сокета:

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 ]

2 голосов
/ 06 августа 2011

Из Конструктор ObjectInputStream * Документация :

Этот конструктор будет блокироваться до соответствующего ObjectOutputStream написал и очистил заголовок.

Что-нибудь записывается в сокет с другого конца? Вы смываете поток с другого конца?

Конструктор ObjectOutputStream имеет документацию, в которой говорится, что пользователи могут захотеть выполнить сброс потока, чтобы входные потоки не блокировались.

0 голосов
/ 06 августа 2011

Останавливается ли он на этой строке конкретно или, возможно, внутри конструктора или даже внутри вызова s.getInputStream ()?И конструктор, и getInputStream () могут генерировать IOException.

Не для того, чтобы понять точку, но вы прыгнули в вызов конструктора и метод getInputStream () при его отладке?

Как сказал выше Atreys, вероятно, было бы полезно увидеть стекслед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...