Закрытие сокета с ошибкой - PullRequest
1 голос
/ 07 июня 2011

Я записываю кучу данных в сокет, однако после того, что, как кажется, написано около 64 Кб, сокет закрывается с ошибкой «Сброс соединения по пиру». Я полагаю, что происходит то, что чтение сокета (Android Media Player) умирает при попытке прочитать больше данных, чем доступно из сокета. Это песня, которая передается в потоковом режиме, и когда тег id3 довольно большой, он не работает. Однако, когда я удаляю информацию id3 из песни, она отлично работает.

Поскольку я считаю, что сторона чтения не работает, когда данных недостаточно, мне интересно, можно ли записать группу данных в сокет перед вызовом socket.accept (), чтобы принять соединение для его чтения. Я думаю здесь, что когда медиаплеер подключается к сокету, будет достаточно данных, чтобы он мог прочитать и, следовательно, не зависнуть. Так что вы можете вызвать write (), прежде чем accept ()?

Вот некоторый псевдокод моего текущего кода:

    ServerSocket socket = new ServerSocket(port, 0, InetAddress.getByAddress(new byte[] {127,0,0,1}));

    socket.setSoTimeout(10000);
    port = socket.getLocalPort();

    Socket client = socket.accept();

    ...

    while (isRunning && (readBytes = data.read(buff, 0, buff.length)) != -1) {

        client.getOutputStream().write(buff, 0, readBytes);           

    }

1 Ответ

1 голос
/ 07 июня 2011

Обычно это означает, что вы записали соединение, которое уже было закрыто другим концом.Другими словами, ошибка протокола приложения.64 КБ, вероятно, просто представляют объем буферизации между вами и партнером.

Ваш вопрос о записи в сокет перед accept () не имеет смысла, если он относится к серверу.Однако, если вы имеете в виду client запись в сокет, это действительно может произойти.Клиент может подключиться, записать (до предела доступной буферизации) и закрыть до того, как сервер когда-либо примет вызовы.Это связано с очередью TCP «backlog», при которой стек TCP асинхронно завершает соединения и ставит их в очередь, готовые для принятия приложением.

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