2013-09-09 2 views
0

Привет, у меня есть 2 класса, чтобы вставить файл в Android-устройство.Передача файла с использованием Sockets Server/Client

Мой CLASS Сервер:

public class FileServer { 
     public static void main (String [] args) throws IOException { 
     // create socket 
     ServerSocket servsock = new ServerSocket(13267); 
     while (true) { 
      System.out.println("Waiting..."); 

      Socket sock = servsock.accept(); 
      System.out.println("Accepted connection : " + sock); 

      // sendfile 
      File myFile = new File ("C:\\Users\\Petrica\\Desktop\\zzz.txt"); 
      byte [] mybytearray = new byte [(int)myFile.length()]; 
      FileInputStream fis = new FileInputStream(myFile); 
      BufferedInputStream bis = new BufferedInputStream(fis); 
      bis.read(mybytearray,0,mybytearray.length); 
      OutputStream os = sock.getOutputStream(); 
      System.out.println("Sending..."); 
      os.write(mybytearray,0,mybytearray.length); 
      os.flush(); 
      sock.close(); 
      } 
     } 
    } 

And my Client Class: 

public class TCPClient extends AsyncTask{ 
@Override 
protected Object doInBackground(Object... params) { 
    int filesize=6022386; // filesize temporary hardcoded 

    long start = System.currentTimeMillis(); 
    int bytesRead; 
    int current = 0; 
    // localhost for testing 
    Socket sock = null; 
    try { 
     sock = new Socket("127.0.0.1",13267); 
    } catch (UnknownHostException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    System.out.println("Connecting..."); 

    // receive file 
    try { 
    byte [] mybytearray = new byte [filesize]; 
    InputStream is = sock.getInputStream(); 
    FileOutputStream fos = new FileOutputStream("/mnt/sdcard/zzz.txt"); 
    BufferedOutputStream bos = new BufferedOutputStream(fos); 

     bytesRead = is.read(mybytearray,0,mybytearray.length); 


    current = bytesRead; 

    // thanks to A. Cádiz for the bug fix 
    do { 
     bytesRead = 
      is.read(mybytearray, current, (mybytearray.length-current)); 
     if(bytesRead >= 0) current += bytesRead; 
    } while(bytesRead > -1); 

    bos.write(mybytearray, 0 , current); 
    bos.flush(); 
    long end = System.currentTimeMillis(); 
    System.out.println(end-start); 
    bos.close(); 
    sock.close(); 
    // TODO Auto-generated method stub 

} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    return null; 
} 
} 

Я получаю сообщение об ошибке

09-09 15:52:39.261: E/AndroidRuntime(802): FATAL EXCEPTION: AsyncTask #1 
09-09 15:52:39.261: E/AndroidRuntime(802): java.lang.RuntimeException: An error occured while executing doInBackground() 
09-09 15:52:39.261: E/AndroidRuntime(802): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
09-09 15:52:39.261: E/AndroidRuntime(802): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.lang.Thread.run(Thread.java:841) 
09-09 15:52:39.261: E/AndroidRuntime(802): Caused by: java.lang.NullPointerException 
09-09 15:52:39.261: E/AndroidRuntime(802): at com.aaaaaa.TCPClient.doInBackground(TCPClient.java:33) 
09-09 15:52:39.261: E/AndroidRuntime(802): at com.aaaaaa.TCPClient.doInBackground(TCPClient.java:1) 
09-09 15:52:39.261: E/AndroidRuntime(802): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-09 15:52:39.261: E/AndroidRuntime(802): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
09-09 15:52:39.261: E/AndroidRuntime(802): ... 4 more 

MainActivity:

public class MainActivity extends Activity { 
    TCPClient tcpc; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      // TODO Auto-generated method stub 
      super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
      Button btn = (Button) findViewById(R.id.send_button); 
      btn.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
      tcpc.execute(); 
       } 
      }); 
     } 


} 

Кто-нибудь есть идея, что я должен делать ??? В будущем я бы хотел отправить 2 файла: D. Спасибо за советы.

+0

Прежде всего, проверьте свою активность, потому что это бросает исключения нулевого указателя. –

+0

В моей деятельности у меня есть кнопка, которая на клик выполняет мой метод doinbackground. – Petrica

+0

Что происходит в строке 15 активности, во время onCreate()? Может быть, вы можете включить onCreate? –

ответ

1

Вы действительно должны иметь возможность самостоятельно сортировать NullPointerExceptions: ожидайте этого, но когда вы закончите это, ваш код копирования будет неправильным. Вы в настоящее время игнорируете счет, возвращаемый read() и предполагая, что он заполняет буфер. Это не гарантируется. См. Javadoc.

while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Используйте это на обоих концах, с любым размером буфера> 0, как правило, 8192.

0

Я не думаю, что ваше гнездо соединяется, но его трудно сказать. В выводе журнала говорится об ошибке NullPointerException, вызванном линией doInBackground() 33. Вы должны проверить строку 33 в своем редакторе, а еще лучше показать нам в своем сообщении, какая строка - 33. У меня вроде бы возникает ощущение, что вы называете Socket sock = null ;, затем вы пытаетесь создать экземпляр нового Socket в блоке try, но это терпит неудачу, поэтому носок еще == null, затем вы вызываете метод на носок и стрелу NPE.

Если вы используете сервер на компьютере и AsyncTask на устройстве Android, вы не сможете попробовать подключиться к localhost (127.0.0.1). Вместо этого попробуйте подключиться к внутренней сети ip вашего компьютера (что-то вроде 192.168.1.XXX), предполагая, что оба устройства подключены к WiFi. Если вы используете эмулятор Android, то 127.0.0.1 возвращает обратно эмулируемое устройство, а все сеансы эмулятора запускаются на эмулированном маршрутизаторе, который вам нужно будет настроить для перенаправления портов, прежде чем вы сможете обратиться к машине разработки, см. Здесь - >http://developer.android.com/tools/devices/emulator.html#emulatornetworking

Как говорит Андрас Балазс Лайтха, похоже, что TCPClient никогда не инициализируется/не создается во время onCreate(), он объявляется только. Так как ваш вывод logcat показывает ошибки в TCPClient, я предполагаю, что этот код действительно работает.

В целом, когда вы публикуете вывод журнала, который ссылается на проблемы с определенной строкой кода, вы должны начать там, а когда вы публикуете, рассказываете нам или показываете нам, какая строка. И, конечно, если строка 33 не связана с нулевым объектом Socket, то я вообще не очень помог :)

+0

спасибо, им запустил его на эмуляторе прямо сейчас – Petrica