2014-12-03 52 views
0

我试图执行下面的代码将文件从android模拟器传输到PC。该应用程序强制关闭,我在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) 

我试图研究这个错误,但IM无法解决它。由于即时通讯新的android,这将是非常有帮助的,如果有人可以帮助我这个。

客户端代码:

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(); 
    } 
    } 
    }; 
    } 

Server代码:

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?所以客户端为空。将客户端改为套接字。 – greenapps 2014-12-03 23:26:30

回答

3

欢迎来到堆栈溢出!

您没有正确初始化您的套接字以适合初学者。

应该

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

其中 “192.19.2.22” 是您的服务器的IP。

此外,尝试很好地格式化您的代码,使其可读性。

+0

我按照建议做了更改,但仍然不会传输android模拟器中的文件,我可以通过文件资源管理器查看模拟器中存在的文件。 – 2014-12-04 19:34:45