Байтбуфер канала Android NIO пуст на приемнике

У меня возникла проблема, когда я открываю локальный файл на своем устройстве Android и пытаюсь отправить его на другое устройство, которое прослушивает порт. Он отправляет информацию (я вижу данные в mappedByteBuffer). Однако, когда данные получены на прослушивателе и я просматриваю byteBuffer, все данные пусты. Может ли кто-нибудь указать, что я делаю неправильно? Спасибо!

Отправитель:

WritableByteChannel channel;
FileChannel fic;
long fsize;
ByteBuffer byteBuffer;
MappedByteBuffer mappedByteBuffer;

connection = new Socket(Resource.LAN_IP_ADDRESS, Resource.LAN_SOCKET_PORT); 
out = connection.getOutputStream(); 
File f = new File(filename);

in = new FileInputStream(f);
fic = in.getChannel();
fsize = fic.size();
channel = Channels.newChannel(out); 

//other code    

//Send file
long currPos = 0;
while (currPos < fsize)
{
    if (fsize - currPos < Resource.MEMORY_ALLOC_SIZE)
    {                       
        mappedByteBuffer = fic.map(FileChannel.MapMode.READ_ONLY, currPos, fsize - currPos);
        channel.write(mappedByteBuffer);
        currPos = fsize;
    }
    else
    {
        mappedByteBuffer = fic.map(FileChannel.MapMode.READ_ONLY, currPos, Resource.MEMORY_ALLOC_SIZE);
        channel.write(mappedByteBuffer);
        currPos += Resource.MEMORY_ALLOC_SIZE;
    }
}

closeAllConnections(); //closes connection, fic, channel, in, out

Слушатель

FileChannel foc;
ByteBuffer byteBuffer;
ReadableByteChannel channel;

serverSoc = new ServerSocket(myPort);
connection = serverSoc.accept(); 
connection.setSoTimeout(3600000);
connection.setReceiveBufferSize(Resource.MEMORY_ALLOC_SIZE);
in = connection.getInputStream();
out = new FileOutputStream(new File(currentFileName));
foc = out.getChannel();
channel = Channels.newChannel(in); 

//other code        

while (fileSize > 0)
{
    if (fileSize < Resource.MEMORY_ALLOC_SIZE)
    {
        byteBuffer = ByteBuffer.allocate((int)fileSize);
        channel.read(byteBuffer); 
        //byteBuffer is blank!
        foc.write(byteBuffer);
        fileSize = 0;
    }
    else
    {
        byteBuffer = ByteBuffer.allocate(Resource.MEMORY_ALLOC_SIZE);
        channel.read(byteBuffer);
        //byteBuffer is blank!                         
        foc.write(byteBuffer);
        fileSize -= Resource.MEMORY_ALLOC_SIZE;
    }
}

closeAllConnections(); //closes connection, foc, channel, in, out, serverSoc

Примечание. MEMORY_ALLOC_SIZE = 32768


person abeauchamp    schedule 26.01.2012    source источник
comment
Я считаю, что проблема заключается в вызове метода перемотки назад. Я реструктурировал свой слушатель, чтобы он делал следующее, и я думаю, что теперь он работает: byteBuffer.rewind(); канал.читать(byteBuffer); byteBuffer.rewind(); foc.write(byteBuffer);   -  person abeauchamp    schedule 27.01.2012


Ответы (1)


Найден лучший способ записи в каналы следующим образом (не используйте мой оригинальный способ, он создает пропущенные символы и лишние пробелы):

while (channel.read(byteBuffer) != -1) 
{  
    byteBuffer.flip();  
    foc.write(byteBuffer);  
    byteBuffer.compact();  
}

byteBuffer.flip();  
while (byteBuffer.hasRemaining()) 
{  
    foc.write(byteBuffer);  
}
person abeauchamp    schedule 28.01.2012