Transferencia de archivos de socket android

Necesito ayuda … He entendido cómo hacer servidor-cliente conector socket … Funciona fie … Ahora quiero transferir archivos de servidor a cliente y volver …. aquí están mis fuentes …

Servidor de socket …

public class ServerActivity extends Activity { private TextView serverStatus; // default ip public static String SERVERIP = "192.168.1.1"; // designate a port public static final int SERVERPORT = 8080; private Handler handler = new Handler(); private ServerSocket serverSocket; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); serverStatus = (TextView) findViewById(R.id.server_status); SERVERIP = getLocalIpAddress(); Thread fst = new Thread(new ServerThread()); fst.start(); } public class ServerThread implements Runnable { public void run() { try { if (SERVERIP != null) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Listening on IP: " + SERVERIP); } }); serverSocket = new ServerSocket(SERVERPORT); while (true) { // listen for incoming clients Socket client = serverSocket.accept(); ///////////////////////////////// File myFile = new File ("/sdcard/frostwire.apk"); 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 = client.getOutputStream(); System.out.println("Sending..."); serverStatus.setText("sending 123.exe..."); os.write(mybytearray,0,mybytearray.length); os.flush(); client.close(); //////////////////////////// handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Connected."); } }); try { BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; while ((line = in.readLine()) != null) { Log.d("ServerActivity", line); handler.post(new Runnable() { @Override public void run() { // do whatever you want to the front end // this is where you can be creative } }); } break; } catch (Exception e) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); } }); e.printStackTrace(); } } } else { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Couldn't detect internet connection."); } }); } } catch (Exception e) { handler.post(new Runnable() { @Override public void run() { serverStatus.setText("Error"); } }); e.printStackTrace(); } } } // gets the ip address of your phone's network private String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (SocketException ex) { Log.e("ServerActivity", ex.toString()); } return null; } @Override protected void onStop() { super.onStop(); try { // make sure you close the socket upon exiting serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } 

Cliente de socket …

 public class ClientActivity extends Activity { private EditText serverIp; private Button connectPhones; private String serverIpAddress = ""; private boolean connected = false; private Handler handler = new Handler(); int filesize; // filesize temporary hardcoded long start = System.currentTimeMillis(); int bytesRead; int current = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.client); serverIp = (EditText) findViewById(R.id.server_ip); connectPhones = (Button) findViewById(R.id.connect_phones); connectPhones.setOnClickListener(connectListener); } private OnClickListener connectListener = new OnClickListener() { @Override public void onClick(View v) { if (!connected) { serverIpAddress = serverIp.getText().toString(); if (!serverIpAddress.equals("")) { Thread cThread = new Thread(new ClientThread()); cThread.start(); } } } }; public class ClientThread implements Runnable { public void run() { try { InetAddress serverAddr = InetAddress.getByName(serverIpAddress); Log.d("ClientActivity", "C: Connecting..."); Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); connected = true; ////////// // receive file byte [] mybytearray = new byte [filesize]; InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream("/sdcard/frostwire.apk"); BufferedOutputStream bos = new BufferedOutputStream(fos); bytesRead = is.read(mybytearray,0,mybytearray.length); current = bytesRead; 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(); socket.close(); ////////////////////////////// while (connected) { try { Log.d("ClientActivity", "C: Sending command."); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket .getOutputStream())), true); // where you issue the commands out.println("Hey Server!"); Log.d("ClientActivity", "C: Sent."); } catch (Exception e) { Log.e("ClientActivity", "S: Error", e); } } socket.close(); Log.d("ClientActivity", "C: Closed."); } catch (Exception e) { Log.e("ClientActivity", "C: Error", e); connected = false; } } } } 

Las fuentes que están marcadas con "///////" no funcionan …. Ayuda

Mejor reemplazar el siguiente código

 do { bytesRead = is.read(mybytearray, current, (mybytearray.length-current)); if(bytesRead >= 0) current += bytesRead; } while(bytesRead > -1); 

Con el siguiente

 do { bytesRead =is.read(mybytearray, current, (mybytearray.length-current)); if(bytesRead > 0) { current += bytesRead; } } while(bytesRead > 0); 

Entonces inténtalo

Después de pasar por encima de la discusión me gustaría añadir algunos comentarios-

  1. ¿Ha agregado código de permiso para leer sdcard en el archivo de manifiesto android? Si no, debe agregar el código siguiente, ya que el servidor está accediendo al almacenamiento externo. Hacer para el cliente también para escribir en el almacenamiento externo.
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

  1. De lo contrario, el directorio que ha proporcionado no es correcto. Compruebe el directorio.

  2. En el programa cliente, se ha definido file_size al que no se asigna ningún valor en ninguna parte del programa.

  3. También quisiera sugerir que, el file_size en el programa del cliente debe ser mayor que el archivo a transferir y el tamaño está en byte.

  • Problema con el archivo de envío de Bluetooth de Android
  • Socket EADDRINUSE (Dirección ya en uso)
  • ¿Cómo obtener el estado del mensaje leído / no leído usando XMPP Smack API?
  • Android: socket bluetooth se niegan a conectarse correctamente
  • Aplicación de congelación de socket Android Bluetooth
  • Conector de Bluetooth
  • Cómo crear conexión Socket en Android?
  • Android: los sockets nativos no eliminan el modo de suspensión 3G en el primer intento
  • ¿Cómo enviar el archivo usando bluetooth en android programatically?
  • Cierre el zócalo al terminar la aplicación
  • Conectar a un socket bloquea la interfaz de usuario
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.