Проблема с сокетом связи [Android] - PullRequest
2 голосов
/ 03 августа 2011

Я программирую сервер-клиентское приложение, и у меня возникла проблема при передаче на устройство песни в виде двоичного байтового массива с сервера.

Код, который я использую, следующий:

int bytesRead = 0;
        FileOutputStream fos = new FileOutputStream(file);
        DataOutputStream dosToFile = new DataOutputStream(fos);
        long totalBytesWritten = 0;
        byte[] buffer = new byte[5024]; 
        do {
            bytesRead = dis.read(buffer, 0, 5024);
            if ( bytesRead > 0) {
                dosToFile.write(buffer, 0, bytesRead);
                dosToFile.flush();
                totalBytesWritten += bytesRead;             
                Log.e("", "Total Bytes written = "+ totalBytesWritten);
            } else if ( bytesRead == 0 ) {
                Log.e("","Zero bytes readed when downloading song.");
            } else if ( bytesRead == -1 ) {
                Log.e("","Read returned -1 when downloading song.");
            }
        } while ( bytesRead > -1 );

Проблема возникает, когда песня уже загружена. В последнем чтении, после прочтения последних байтов песни (и записи их на SD-карту), приложение замирает при чтении и не возвращает предполагаемое -1. ​​

Код показан неверно? Должен ли я сделать перевод другим способом?

Я отправляю свои двоичные данные с этим кодом:

byte [] mybytearray  = new byte [(int)myFile.length()];
        mybytearray = this.fileToByteArray(myFile);
        if ( mybytearray != null ) {
            dos.write(mybytearray, 0, mybytearray.length);
            dos.flush();
            System.out.println("Song send.");
        } else {
            System.out.println("The song could not be send.");
        }

Большое спасибо.

Ответы [ 2 ]

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

Решение:

        int bytesRead = 0;
        FileOutputStream fos = new FileOutputStream(file);
        DataOutputStream dosToFile = new DataOutputStream(fos);
        long totalBytesWritten = 0;
        byte[] buffer = new byte[5024];     // 8Kb 
        do {
            bytesRead = dis.read(buffer, 0, 5024);
            if ( bytesRead > 0) {
                dosToFile.write(buffer, 0, bytesRead);
                dosToFile.flush();
                totalBytesWritten += bytesRead;             //Se acumula el numero de bytes escritos en el fichero
            } else if ( bytesRead == 0 ) {
                Log.e("","Zero bytes readed when downloading song.");
            } else if ( bytesRead == -1 ) {
                Log.e("","Read returned -1 when downloading song.");
            }
            if ( totalBytesWritten == fileLength ) break;
        } while ( bytesRead > -1 );
0 голосов
/ 03 августа 2011

Попробуйте это:

int read = nis.read(buffer, 0, 4096); // This is blocking

while (read != -1) {
byte[] tempdata = new byte[read];
System.arraycopy(buffer, 0, tempdata, 0, read);

// Log.i(NTAG, "Got data: " + new String(tempdata));
handler.sendMessage(handler.obtainMessage(MSG_NETWORK_GOT_DATA, tempdata));
read = nis.read(buffer, 0, 4096); // This is blocking
}

Обработчик - это просто мой способ отправки сообщения, которое нужно проанализировать (или записать в файл). Вы можете сделать что угодно здесь. Когда он закончил читать, он только что прочитал, нет необходимости проверять в цикле. Вы можете перехватить исключения, такие как SocketTimeoutException и т. Д., Чтобы определить, в чем может быть проблема.

...