0

я хочу, чтобы сделать приложение для передачи файлов с помощью Wi-Fi прямой, но мой посыла и прогресс бар приемник не будет обновлятьAndroid файла отправить между двумя телефонами с помощью сокетов и прогресс бар

мой отправитель

public void Server() { 

    new Thread(new Runnable() 
    { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
     try { 
      //receive ip 
      serverSocket = new ServerSocket(port); 
      Socket socket = serverSocket.accept(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String line = null; 
      while ((line = in.readLine()) != null) { 
       ClientIP = line; 
      } 

      in.close(); 
      socket.close(); 
      serverSocket.close(); 
      socket = null; 
      serverSocket = null; 

      try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

      //send file 
      socket = new Socket(); 
      socket.bind(null); 
      socketAddress = new InetSocketAddress(ClientIP, portal); 
      socket.connect(socketAddress, SOCKET_TIMEOUT); 

      FragmentManager fm = getFragmentManager(); 
      md = new MyDialog("Send to " + ClientIP); 
      md.setRetainInstance(true); 
      md.setCancelable(true); 
      md.show(fm, "Sender"); 

      //reset progress bar status 
      progressBarStatus = 0; 
      //reset filesize 
      fileSize = 0; 

      byte buf[] = new byte[1024]; 
      File myFile = new File (path); 
      filelength = file.length(); 

      OutputStream os = socket.getOutputStream(); 
      FileInputStream fis = new FileInputStream(myFile); 
      BufferedInputStream bis = new BufferedInputStream(fis); 

      while ((len = bis.read(buf)) != -1) { 
       fileSize+=len; 
       os.write(buf, 0, len); 
       os.flush(); 
       //count for progress bar 
       double d = (double) (fileSize * 100)/filelength; 
       progressBarStatus = (int) Math.round(d); 
       progressBarHandler.post(new Runnable() { 
        public void run() { 
         md.updateProgress(progressBarStatus); 
        } 
       }); 
      } 

      os.close(); 
      fis.close(); 
      bis.close(); 
      socket.close(); 

      // ok, file is downloaded, 
      if (progressBarStatus >= 100) { 

       // sleep 2 seconds, so that you can see the 100% 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       isSent = true; 

       runOnUiThread(new Runnable() { 
        public void run() { 
         if(isSent) {  
          Toast.makeText(getApplicationContext(), "File Sent", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 

       md.dismiss(); 
      } 


      } catch (IOException e) { 
       Log.e(TAG, "I/O Exception", e); 
      } finally { 
       if (socket != null) { 
        if (socket.isConnected()) { 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          // Give up 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    }).start(); 
} 

моего приемник

public void Client (final String hostAddress) { 

    socketAddress = new InetSocketAddress(hostAddress, port); 
    socket = new Socket(); 


    new Thread(new Runnable() 
    { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     try { 
      //sent ip 
      socket.bind(null); 
      socket.connect(socketAddress, SOCKET_TIMEOUT); 
      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      out.println(messsage); 
      out.flush(); 
      out.close(); 
      socket.close(); 
      socket = null; 

      //receive file 
      socket = new Socket(); 
      serverSocket = new ServerSocket(portal); 
      socket = serverSocket.accept(); 

      final String name; 
      final String ext; 

      String[] tokens = filename.split("\\.(?=[^\\.]+$)"); 
      name = tokens[0]; 
      ext = tokens[1]; 

      final File f = new File(Environment.getExternalStorageDirectory() + "/" 
        + getPackageName() + "/" + name + System.currentTimeMillis() 
        + "." + ext); 


      File dirs = new File(f.getParent()); 

      if (!dirs.exists()) 
       dirs.mkdirs(); 


      f.createNewFile(); 


      FragmentManager fm = getFragmentManager(); 

       md = new MyDialog("Receive from " + HostIP); 
       md.setRetainInstance(true); 
       md.setCancelable(true); 
       md.show(fm, "Receiver"); 

      //reset progress bar status 
       progressBarStatus = 0; 
       //reset filesize 
       fileSize = 0; 

       filelength = f.length(); 

      InputStream is = socket.getInputStream(); 
      FileOutputStream fos = new FileOutputStream(f); 
      BufferedOutputStream bos = new BufferedOutputStream(fos); 
      byte buf[] = new byte[1024]; 



      while ((len = is.read(buf)) != -1) { 
       bos.write(buf, 0, len); 
       bos.flush(); 
       fileSize+=len; 
       double d = (double) (fileSize * 100)/filelength; 
       progressBarStatus = (int) Math.round(d); 
       progressBarHandler.post(new Runnable() { 
        public void run() { 
         md.updateProgress(progressBarStatus); 
        } 
       }); 
      } 

      is.close(); 
      fos.close(); 
      bos.close(); 
      socket.close(); 
      serverSocket.close(); 

      if (progressBarStatus >= 100) { 

       // sleep 2 seconds, so that you can see the 100% 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       isSent = true; 
       // close the progress bar dialog 
       //progressBar.dismiss(); 
       runOnUiThread(new Runnable() { 
        public void run() { 
         // some code #3 (that needs to be ran in UI thread) 
         if(isSent) {  
          Toast.makeText(getApplicationContext(), "File Received", Toast.LENGTH_SHORT).show(); 
          btn.setEnabled(true); 
         } 
        } 
       }); 

       md.dismiss(); 
      } 

      } catch (IOException e) { 
       Log.e(TAG, "IO Exception.", e); 
      } 
     } 
    }).start(); 
} 

и я использовать диалоговый фрагмент, потому что я использую API 14+

моего диалога класс

public class MyDialog extends DialogFragment { 
ProgressBar mProgressBar; 
String title; 

public MyDialog (String title) { 
    this.title = title; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    setRetainInstance(true); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) 
{ 
    View view = inflater.inflate(R.layout.popup, container); 
    mProgressBar = (ProgressBar)view.findViewById(R.id.pb); 

    getDialog().setTitle(title); 

    getDialog().setCanceledOnTouchOutside(false); 

    return view; 
} 

@Override 
public void onDestroyView() 
{ 
    if (getDialog() != null && getRetainInstance()) 
     getDialog().setDismissMessage(null); 
    super.onDestroyView(); 


} 

@Override 
public void onCancel(DialogInterface dialog) { 
    // TODO Auto-generated method stub 
    super.onCancel(dialog); 
    Toast.makeText(getActivity().getApplicationContext(), "Connection lost. Retry", Toast.LENGTH_SHORT).show(); 
    getActivity().finish(); 
} 

public void updateProgress(int percent) 
{ 
    mProgressBar.setProgress(percent); 
} 
} 

я не знаю, почему мой код не работает, мой прогресс бар не будет обновлять и файл не отправить. Кто-нибудь может мне помочь? thx до

ответ

0

У вас есть много кода, но, насколько я знаю, приемник должен использовать AsyncTask, вот как я это делаю, и он работает для меня. Вместо потока используйте Asynctask и метод OnProgressUpdate для AsyncTask для обновления ProgressDialog в основном потоке. Например:

public class getFile extends AsyncTask<Void, String, Void> 
{ 

    ProgressDialog pB; 
    String hostAddress=null; 
    InetSocketAddress socketAddress; 
    Socket socket=null; 
    ServerSocket serverSocket=null; 
    int port=3001; 
    int SOCKET_TIMEOUT = 3000; 

    public getFile(String _hostAddress, Context context) 
    { 
     this.pB = new ProgressDialog(context); 
     this.pB.setTitle(context.getText(R.string.sYourMessageText); 
     this.pB.setMessage(null); 
     this.pB.setProgressNumberFormat(null); 
     this.pB.setProgressPercentFormat(null); 
     this.pB.setCancelable(false); 
     Drawable d = getResources().getDrawable(R.drawable.x_greenprogress); 
     pB.setProgressDrawable(d); 
     pB.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     hostAddress=_hostAddress; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     this.pB.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) 
    { 
     try { 
      //sent ip 
      socketAddress = new InetSocketAddress(this.hostAddress, port); 
      socket = new Socket(); 
      socket.bind(null); 
      socket.connect(socketAddress, SOCKET_TIMEOUT); 
      PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      out.println(messsage); 
      out.flush(); 
      out.close(); 
      socket.close(); 
      socket = null; 

      //receive file 
      socket = new Socket(); 
      serverSocket = new ServerSocket(portal); 
      socket = serverSocket.accept(); 

      final String name; 
      final String ext; 

      String[] tokens = filename.split("\\.(?=[^\\.]+$)"); 
      name = tokens[0]; 
      ext = tokens[1]; 

      final File f = new File(Environment.getExternalStorageDirectory() + "/" 
        + getPackageName() + "/" + name + System.currentTimeMillis() 
        + "." + ext); 


      File dirs = new File(f.getParent()); 

      if (!dirs.exists()) 
      dirs.mkdirs(); 

     f.createNewFile(); 


     InputStream is = socket.getInputStream(); 
     FileOutputStream fos = new FileOutputStream(f); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     byte buf[] = new byte[1024]; 
     while ((len = is.read(buf)) != -1) 
     { 
      bos.write(buf, 0, len); 
      bos.flush(); 
      fileSize+=len; 
      // to update the progress bar just call: 
      this.publishProgress("" + (int) ((fileSize * 100)/filelength)); 
     } 
     is.close(); 
     fos.close(); 
     bos.close(); 
     socket.close(); 
     serverSocket.close(); 
    } 

    @Override 
    protected void onProgressUpdate(String... progress) 
    { 
     this.pB.setProgress(Integer.parseInt(progress[0])); 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     if (this.pB.isShowing()) 
      this.pB.dismiss(); 
    } 

} 

EDIT: Кстати, почему вы подключаетесь к серверу, отправить IP-закрыть соединение и ждать, пока сервер для подключения? Почему не использовать первый сокет для передачи файла? Соединение уже установлено.

+0

thx ja_mesa для вашего ответа, я знаю проблему. это потому, что я не могу получить доступ к потоку ui при отправке файла. Я не использовал async-задачу, потому что я уже использовал поток в своих приложениях. поэтому я не могу использовать asynctask в моем потоке. Знаете ли вы, как вызвать md.updateProgress (progressBarStatus); с ui нитью? –

+0

Я использую два подключения, потому что в первом соединении сервер использовал сокет для приема клиента ip и второе соединение, используемое для отправки файла. thx для вашего совета ja_mesa. –

+0

Чтобы обновить пользовательский интерфейс из потока, прочитайте [this] (http://stackoverflow.com/questions/4369537/update-ui-from-thread) –

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

  • Нет связанных вопросов^_^