запись поверх отключенного сокета не выкидывает - PullRequest
5 голосов
/ 09 августа 2011

писатель:

   socket.setSendBufferSize(1);
   socket.setTcpNoDelay(true);
   writer = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

используется следующим образом:

try {
        writer.write(packet.toXML());
        writer.flush();
        ...
    }
    catch (Exception ioe){
        if (!done) {
            done = true;
            ... 
        }       
    }

Это код на стороне клиента.Когда его сервер отключает сокет (также Java-код), как получится, что клиент скинет только через 5 - 10 минут?Разве он не должен выдать с первой попытки переписать потерянное соединение?

Спасибо

Редактировать:

после выключения сервера, вот состояния TCP:

tcp        0      0 server:443     client:50283   FIN_WAIT2 

tcp4       0      0  cient.50283     server.443       CLOSE_WAIT

Edit2:

клиент является приложением для Android.Побежал с телефона, второй записанный пакет вызывает бросок.Побежал из эмулятора (под Mac) четвертый write () скинет.

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

Если он не бросит с первой попытки переписать мертвых соединение?

Нет. Все, что он знает, - это то, что был получен FIN, который мог быть только что закрыт shutdownOutput () одноранговым узлом - он все еще мог читать. Так что TCP должен отправить данные. Если узел закрыт, он выдаст RST, который TCP предоставит приложению при последующей записи.

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

Согласно документации, читатели должны возвращать -1 при операциях read (), но я ничего не получал, потому что какой-то XmlPullparser мешал

parser.setInput(connection.reader);

Итак, писатель ведет себя как EJP, описанный выше, но если у вас есть доступ к исходному коду, мы можем создать экземпляр нашего connection.reader как некоторый InputStreamReaderEx, например, так:

/ ** * @author kellogs * * / открытый класс InputStreamReaderEx extends InputStreamReader {

/* (non-Javadoc)
 * @see java.io.BufferedReader#read()
 */
@Override
public int read() throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read();

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

/* (non-Javadoc)
 * @see java.io.BufferedReader#read(char[], int, int)
 */
@Override
public int read(char[] buffer, int offset, int length) throws IOException {
    // TODO Auto-generated method stub
    int ret = super.read(buffer, offset, length);

    if (ret == -1)
    {
        int l = 4;
    }

    return ret;
}

}

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

...