2012-01-19 21 views
5

Yardıma ihtiyacım var. Sunucu-istemci soket konektörünün nasıl yapılacağını anladım ... Bu işe yaramaz ... Artık dosyaları sunucudan istemciye aktarmak istiyorum .... işte kaynaklarım ...android soket dosya aktarımı

Soket sunucusu ...

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

} 

Soket Müşteri ... "///////" don işaretlenir kaynağın

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

adet Çalışmıyor .... Yardım

+0

Sadece "işe yaramıyor" demek pek bir ipucu değil ... Belki daha iyi açıklamaya çalışabilir misiniz? Size yardım etmemize yardımcı oluyor. –

+0

Socket Server bir hata veriyor ... Yanlış bir şey olduğunu anladığım kadarıyla: – timonvlad

+0

byte [] mybytearray = new byte [filesize]; InputStream is = socket.getInputStream(); FileOutputStream fos = yeni FileOutputStream ("/ sdcard/frostwire.apk"); BufferedOutputStream bos = new BufferedOutputStream (fos); bytesRead = is.read (mybytearray, 0, mybytearray.length); current = bytesRead; { bytesRead = is.read (mybytearray, geçerli, (mybytearray.length-current)); eğer (bytesRead> = 0) mevcut + = bytesRead; Sunucu ve istemci tarafında – timonvlad

cevap

1


iyi aşağıdaki biri

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


ile kod aşağıdaki

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

yerine Sonra ben birkaç Yorumlar: Kullanıcıların eklemek istiyorum Yukarıdaki tartışma geçiyor sonra o

0

deneyin

  1. Android manifest dosyasında sdcard okumak için izin kodu eklediniz mi? Değilse, sunucu Harici Depolama'ya erişirken aşağıdaki kodu eklemelisiniz. İstemcinin harici depolamada da yazmasını sağlayın.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

    , verdiğiniz dizin doğru Else
  1. değildir. Dizini kontrol et.

  2. İstemci programında, programın hiçbir yerinde herhangi bir değer atanmamış file_size tanımladınız.

  3. Ayrıca, istemci programındaki file_size'nin aktarılacak dosyadan büyük olması ve boyutun bayt cinsinden olması gerektiğini de belirtmek isterim.

İlgili konular