2014-09-09 1 views
0

Теперь это очень странно .... У меня есть два устройства для Android, в которых оба они работают один как сервер, а другой как клиент.Java Socket Отправка нескольких файлов, но полученных одним файлом?

Проблема заключается в том, что клиент отправляет файл через сокет. Сервер получит его в порядке. Но когда клиент пытается отправить несколько файлов, , тогда сервер получит только один файл ... почему так?

Я уже промывал сокет для каждого файла из списка (клиента). Но ... Почему код сервера (получателя) только записывает один файл в качестве вывода?

Please cmiiw.

Вот код для сервера (получение):

Socket bSock = serverSocket.accept(); 

    DataInputStream inp = new DataInputStream(
    bSock.getInputStream()); 

// reading the code first 

int iCode = inp.readInt(); 

if(iCode == Request.STATE_FILESHARING){ 

         // reading how many files will be found 
    int manyFile = inp.readInt(); 
    String dName = null; 

    for (int index = 0; index < manyFile; index++) { 

    // reading the file name 
    dName = inp.readUTF(); 

    // reading the file size 
    byte bp[] = new byte[inp.readInt()]; 

    FileOutputStream fos = new FileOutputStream(SDTool.getCurrentLocalTransferPath() + "/" + dName); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 

    // reading the content 
    int count; 
    int fsize = 0; 
    while ((count = inp.read(bp, 0, bp.length)) != -1) { 
      fsize += count; 
      bos.write(bp, 0, count); 

      // this will exist the loop of reading 
      if(fsize == bp.length) 
      break; 

     } 

    bos.close(); 
    fos.close(); 

    } 

} 

и вот код для Клиента (отправка):

socket = new Socket(myServerAddress, SocketServerPORT); 
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 

double dTotalSize = getTotalSize(nList); 
int iTotalTransferred = 0; 
double dPercentage = 0; 

DecimalFormat df = new DecimalFormat("#.00"); 

// sending multiple files state 
out.writeInt(Request.STATE_FILESHARING); 
// sending how many files required to be accepted 
out.writeInt(nList.size()); 

for (Item o : nList) { 
     File myFile = new File(o.getPath()); 
     byte[] mybytearray = new byte[(int) myFile.length()]; 
     FileInputStream fis = new FileInputStream(myFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     // bis.read(mybytearray, 0, mybytearray.length); 

     // set the code, the file name, and then the size 
     out.writeUTF(myFile.getName()); 
     out.writeInt(mybytearray.length); 


      int len = 0;  int fsize = 0; 
      // here is the content  
      while ((len = bis.read(mybytearray)) != -1) { 
        fsize += len; 
        dPercentage = (double) ((fsize * 100)/dTotalSize); 
        dPercentage = Math.round(dPercentage); 
        out.write(mybytearray, 0, len); 
        updateProgressUploadUI(dPercentage); 
      if(fsize == mybytearray.length){ 
      out.flush();      
      } 
     } 


     bis.close(); 
     fis.close(); 

} 
+0

Пожалуйста, расскажите, как сервер должен знать, что больше файлов идет. Какой протоколл существует между сервером и клиентом? Что посылает клиент? Пожалуйста, объясните это первым. Объясните код. – greenapps

+0

и когда дело доходит до протоколов, рассмотрите этот http://code.google.com/p/protobuf/ – pskink

+0

, я думаю, на стороне сервера, я должен поставить ... этот алгоритм: «Когда он достигнет конечной длины байты.Он должен разорвать цикл чтения содержимого. И начать новую операцию FileIO «Правильно ли я? @greenapps – gumuruh

ответ

1

Вы читаете первый файл до конца потока, что происходит только тогда, когда отправитель закрывает сокет после отправки последнего файла. Таким образом, вы видите все файлы как один поток. Вам нужно ограничить свой цикл чтения только чтением точного количества байтов в каждом файле. Я выложил код здесь много раз, например here.

+0

Я должен правильно поместить if, если внутри содержимого чтения метода сервера? и на клиенте (отправителе) я должен очистить каждый один файл также ... am i right @EJP? Проверьте обновленный код выше. – gumuruh

+1

Нет. Это не решение. Вы используете writeInt(), чтобы сообщить серверу, сколько файлов идет. Но сначала вы должны использовать writeInt для каждого файла. Вы пишете int, который сообщает, сколько байтов будет иметь следующий файл. Тогда сервер может просто прочитать это много байтов, прочитать следующий int и так далее. Поэтому вам нужно адаптировать свой протоколл. Вот почему я попросил вас сначала объяснить, как все это должно работать. – greenapps

 Смежные вопросы

  • Нет связанных вопросов^_^