2014-12-03 6 views
0

Я пытаюсь выполнить приведенный ниже код, чтобы передать файл с эмулятора android на компьютер. Силовые приложение закрывается, и я вижу следующее сообщение об ошибке в LogCat:Перенос файла с android на компьютер с использованием программирования сокетов

12-03 16:56:33.503: D/AndroidRuntime(1145): Shutting down VM 
12-03 16:56:33.503: D/AndroidRuntime(1145): --------- beginning of crash 
12-03 16:56:33.517: E/AndroidRuntime(1145): FATAL EXCEPTION: main 
12-03 16:56:33.517: E/AndroidRuntime(1145): Process: com.example.androidfiletransfer, PID: 1145 
12-03 16:56:33.517: E/AndroidRuntime(1145): java.lang.NullPointerException: Attempt to invoke    virtual method 'java.io.OutputStream java.net.Socket.getOutputStream()' on a null object reference 
12-03 16:56:33.517: E/AndroidRuntime(1145):  at  com.example.androidfiletransfer.MainActivity$1.onClick(MainActivity.java:77) 
12-03 16:56:33.517: E/AndroidRuntime(1145):  at android.view.View.performClick(View.java:4756) 
12-03 16:56:33.517: E/AndroidRuntime(1145):  at android.view.View$PerformClick.run(View.java:19749) 
12-03 16:56:33.517: E/AndroidRuntime(1145):  at android.os.Handler.handleCallback(Handler.java:739) 

следующее сообщение в консоли:

Server started. Listening to the port 4444 
Receiving... 
mybytearray: 100000000 
current: -1 
bytes read: -1 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException 
at java.lang.System.arraycopy(Native Method) 
at java.io.BufferedOutputStream.write(Unknown Source) 
at Javafilereceive.main(Javafilereceive.java:53) 

Я попытался исследовать на эту ошибку, но им не удалось решить. Поскольку я новый для android, это было бы очень полезно, если бы кто-то мог мне помочь в этом.

Client код сторона:

package com.example.androidfiletransfer; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.StrictMode; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.io.BufferedInputStream; 

public class MainActivity extends Activity { 

//EditText textOut; 
    TextView textIn; 
    Socket client; 
    FileInputStream fileInputStream; 
    BufferedInputStream bufferedInputStream; 
    OutputStream outputStream; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
    } 

    // textOut = (EditText)findViewById(R.id.textout); 
     Button buttonSend = (Button)findViewById(R.id.send); 
     textIn = (TextView)findViewById(R.id.textin); 
     buttonSend.setOnClickListener(buttonSendOnClickListener); 
    } 

     Button.OnClickListener buttonSendOnClickListener 
     = new Button.OnClickListener(){ 

    @Override 
    public void onClick(View arg0) { 
// TODO Auto-generated method stub 
Socket socket; 
DataOutputStream dataOutputStream; 
DataInputStream dataInputStream; 


//File file = new File("/mnt/media_rw/sdcard/download/vivd_flowers-wide.jpg"); //create file instance 
File dir = Environment.getExternalStorageDirectory(); 
File file = new File(dir, "Sample.txt"); 

System.out.println("file length: " + file.length()); 
try { 
socket = new Socket("<ip address", 4444); 
byte[] mybytearray = new byte[(int) file.length()]; //create a byte array to file 
// dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
// dataInputStream = new DataInputStream(socket.getInputStream()); 
// dataOutputStream.writeUTF(textOut.getText().toString()); 
// textIn.setText(dataInputStream.readUTF()); 
    System.out.println("mybytearray in android: " + mybytearray.length); 
    fileInputStream = new FileInputStream(file); 
    bufferedInputStream = new BufferedInputStream(fileInputStream); 

    bufferedInputStream.read(mybytearray, 0, mybytearray.length); //read the file 
    System.out.println("Read into buffer"); 
    outputStream = client.getOutputStream(); 

    outputStream.write(mybytearray, 0, mybytearray.length); //write file to the output stream byte by byte 
    System.out.println("Written to buffer"); 
    outputStream.flush(); 
    bufferedInputStream.close(); 
    outputStream.close(); 
    client.close(); 

    textIn.setText("File Sent"); 
    } catch (UnknownHostException e) { 
    // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (IOException e) { 
    // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
    }; 
    } 

Серверный код:

import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Javafilereceive { 

private static ServerSocket serverSocket; 
private static Socket clientSocket; 
private static InputStream inputStream; 
private static FileOutputStream fileOutputStream; 
private static BufferedOutputStream bufferedOutputStream; 
private static int filesize = 100000000; // filesize temporary hardcoded 
private static int bytesRead; 
private static int current = 0; 

public static void main(String[] args) throws IOException { 


    serverSocket = new ServerSocket(4444); //Server socket 

    System.out.println("Server started. Listening to the port 4444"); 


    clientSocket = serverSocket.accept(); 


    byte[] mybytearray = new byte[filesize]; //create byte array to buffer the file 

    inputStream = clientSocket.getInputStream(); 
    fileOutputStream = new FileOutputStream("D:\\output.jpg"); 
    bufferedOutputStream = new BufferedOutputStream(fileOutputStream); 

    System.out.println("Receiving..."); 
    System.out.println("mybytearray: " + mybytearray.length); 

    //following lines read the input slide file byte by byte 
    bytesRead = inputStream.read(mybytearray, 0, mybytearray.length); 
    current = bytesRead; 

    System.out.println("current: " + current); 
    do { 
     bytesRead = inputStream.read(mybytearray, current, (mybytearray.length - current)); 
     System.out.println("bytes read: " + bytesRead); 
     if (bytesRead >= 0) { 
      current += bytesRead; 
     } 
    } while (bytesRead > -1); 


    bufferedOutputStream.write(mybytearray, 0, current); 
    bufferedOutputStream.flush(); 
    bufferedOutputStream.close(); 
    inputStream.close(); 
    clientSocket.close(); 
    serverSocket.close(); 

    System.out.println("Sever recieved the file"); 

} 
} 

я поместил некоторые Println заявления, чтобы увидеть, если файл выбрать из эмулятора, но выглядит как его нет. Можете ли вы также указать, как указать путь к файлу в android.

+0

'outputStream = client.getOutputStream();'. Это линия 77? Таким образом, клиент имеет значение null. Измените клиента на сокет. – greenapps

ответ

3

Добро пожаловать в переполнение стека!

Вы не правильно инициализировали гнездо для стартеров.

Должно быть

client = new Socket("192.18.2.22",4444); 

Где "192.19.2.22" является IP вашего сервера.

Кроме того, попробуйте форматировать свой код, чтобы сделать его доступным для чтения.

+0

Я сделал изменения, как было предложено, но файл в эмуляторе Android не передается, я вижу файл, присутствующий в эмуляторе через проводник файлов. –

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