it-swarm.com.de

Client-Server: Dateitransfer von Android zu PC über Socket

Ich versuche, ein von mir ausgewähltes Bild aus der Galerie auf meinem Telefon zu senden und dieses Bild vom Telefon an meinen PC zu senden. Wenn ich auf die Schaltfläche klicke, sollte es den Pfad des Bildes übernehmen, es in eine Datei einfügen und es übertragen auf meinen PC. Ich habe den Code auf meinem PC überprüft - für beide Seiten - und es hat einwandfrei funktioniert.

Wenn ich es ausprobiere, passiert nichts!

Hier ist der Code:

Serverseite:

    import Java.io.*;
import Java.net.*;

public class FileServer {

    public static void main(String[] args) throws IOException {
        int filesize=6022386; // filesize temporary hardcoded

        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;

        // create socket
        ServerSocket servsock = new ServerSocket(1149);
        while (true) {
          System.out.println("Waiting...");

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

       // receive file
            byte [] mybytearray  = new byte [filesize];
            InputStream is = sock.getInputStream();
            FileOutputStream fos = new FileOutputStream("C:\\Users\\Arwa\\Documents\\WebOffice.jpg"); // destination path and name of file
            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();
          }
    }

}

Client Seite (Android):

 package com.arwa.file.send;

import Java.io.BufferedInputStream;
import Java.io.File;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.ObjectOutputStream;
import Java.io.OutputStream;
import Java.net.Socket;
import Java.net.UnknownHostException;

import Android.app.Activity;
import Android.content.Intent;
import Android.database.Cursor;
import Android.net.Uri;
import Android.os.Bundle;
import Android.provider.MediaStore;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
import Android.widget.ImageView;
import Android.widget.TextView;

public class SendfileActivity extends Activity {
    /** Called when the activity is first created. */

    private static final int SELECT_PICTURE = 1;

    private String selectedImagePath;
    private ImageView img;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("34");
        img = (ImageView) findViewById(R.id.ivPic);
        System.out.println("36");
        ((Button) findViewById(R.id.bBrowse))
                .setOnClickListener(new OnClickListener() {
                    public void onClick(View arg0) {
                        System.out.println("40");
                        Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(
                                Intent.createChooser(intent, "Select Picture"),
                                SELECT_PICTURE);
                        System.out.println("47");
                    }
                });
        ;
        System.out.println("51");
        Button send = (Button) findViewById(R.id.bSend);
        final TextView status = (TextView) findViewById(R.id.tvStatus);

        send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Socket sock;
                try {
                    sock = new Socket("MY_PCs_IP", 1149); 
                    System.out.println("Connecting...");

                     // sendfile
                          File myFile = new File (selectedImagePath); 
                          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();
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



            }
        });
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                TextView path = (TextView) findViewById(R.id.tvPath);
                path.setText("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
            }
        }
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
}

XML-Code:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/tvStatus"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="@string/hello" />

    <TextView
        Android:id="@+id/tvPath"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Path: " />

    <Button
        Android:id="@+id/bBrowse"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Browse" >
    </Button>

    <Button
        Android:id="@+id/bSend"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Send" />

    <ImageView
        Android:id="@+id/ivPic"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content" >
    </ImageView>

</LinearLayout>
15
Arwa A

sie müssen nur die Erlaubnis hinzufügen

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission Android:name="Android.permission.INTERNET"/>

und es wird perfekt funktionieren.

2
Alaa

Versuchen Sie, anstatt es im Emulator auf dem PC zu versuchen, dasselbe auf einem mobilen Gerät auszuführen. Außerdem habe ich die Portnummer auf 8000 geändert, anstatt den 1149-Port zu verwenden.

Mit diesen Änderungen hat der Code für mich gut funktioniert. Bitte prüfe.

1

Es funktioniert nicht, weil Sie Ihren variablen Strom nicht auf 0 zurückgesetzt haben. Es scheint, als würden Sie in der nächsten Schleife warten, ohne den Wert zurückzusetzen. Meiner Meinung nach könnte dies bei der zweiten Iteration Ihrer Ausführung zu Problemen führen.

0
adnaan.zohran