2016-06-23 9 views
0

ソケット通信を使用して両側からファイルを送信しようとしています。私はserverSocketオブジェクトを作成し、接続を作成しています。 クライアント= serverSocket.accept(); これで、ファイルを両サイドから送信できましたが、1回だけ送信できます。私が接続を切断して再接続するとエラーが発生します::バインドに失敗しました:EADDRINUSE(アドレスはすでに使用中)バインドに失敗しました:EADDRINUSE(アドレスは既に使用中)

私はサーバーソケットとクライアントソケットを正しく閉じています。しかし、まだ私はこのエラーが発生しています..

あなたは私が間違っている人を教えてください。

protected String doInBackground(String... params) { 
      try { 
       CommonMethods.e("File Async task port", "File Async task port-> " + PORT); 
       // init handler for progressdialog 
       serverSocket = new ServerSocket(); 

       serverSocket.bind(new InetSocketAddress(PORT)); 
       serverSocket.setReuseAddress(true); 
       Log.d(CommonMethods.Tag, "Server: Socket opened"); 
       client = serverSocket.accept(); 

       Log.d("Client's InetAddresssss ", "" + client.getInetAddress()); 

       WiFiClientIp = client.getInetAddress().getHostAddress(); 

       ObjectInputStream ois = new ObjectInputStream(
         client.getInputStream()); 
       WiFiTransferModal obj = null; 
       // obj = (WiFiTransferModal) ois.readObject(); 
       String InetAddress; 
       try { 
        obj = (WiFiTransferModal) ois.readObject(); 
        InetAddress = obj.getInetAddress(); 
        if (InetAddress != null 
          && InetAddress 
          .equalsIgnoreCase(FileTransferService.inetaddress)) { 
         CommonMethods.e("File Async Group Client Ip", "port-> " 
           + WiFiClientIp); 
         SharedPreferencesHandler.setStringValues(mFilecontext, 
           "WiFiClientIp", WiFiClientIp); 
         CommonMethods 
         .e("File Async Group Client Ip from SHAREDPrefrence", 
           "port-> " 
             + SharedPreferencesHandler 
             .getStringValues(
               mFilecontext,"WiFiClientIp")); 
         //set boolean true which identifiy that this device will act as server. 
         SharedPreferencesHandler.setStringValues(mFilecontext, 
           "ServerBoolean", "true"); 
         ois.close(); 

         serverSocket.close(); 

         return "Demo"; 
        } 
       } catch (ClassNotFoundException e) {; 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
       final Runnable r = new Runnable() { 

        public void run() { 
         // TODO Auto-generated method stub 
         mProgressDialog.setMessage("Receiving..."); 
         mProgressDialog.setIndeterminate(false); 
         mProgressDialog.setMax(100); 
         mProgressDialog.setProgress(0); 
         mProgressDialog.setProgressNumberFormat(null); 
         mProgressDialog.setCancelable(false); 
         mProgressDialog 
         .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
         mProgressDialog.show(); 
        } 
       }; 
       handler.post(r); 
       Log.e("FileName got from socket on other side->>> ", 
         obj.getFileName()); 

       final File f = new File(
         Environment.getExternalStorageDirectory() + "/" 
           + FolderName + "/" 
           + obj.getFileName()); 

       File dirs = new File(f.getParent()); 
       if (!dirs.exists()) 
        dirs.mkdirs(); 
       f.createNewFile(); 

       System.out.println("dirs==========="+dirs); 
       /* 
       * Recieve file length and copy after it 
       */ 
       this.ReceivedFileLength = obj.getFileLength(); 

       InputStream inputstream = client.getInputStream(); 


       copyRecievedFile(inputstream, new FileOutputStream(f),ReceivedFileLength); 

       ois.close(); 
       serverSocket.close(); 

       this.Extension = obj.getFileName(); 
       this.EncryptedFile = f; 

       return f.getAbsolutePath(); 
      } catch (Exception e) { 
       Log.e(WiFiDirectActivity.TAG, e.getMessage()); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      if (result != null) { 
       FileServerAsyncTask FileServerobj = new 
         FileServerAsyncTask(mFilecontext,FileTransferService.PORT); 
       if(!result.equalsIgnoreCase("Demo")){ 


        try{ 
         serverSocket.close(); 
        }catch (Exception e) { 
         // TODO: handle exception 
        } 
       } 
       else{ 

        if(FileServerobj != null) { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
          FileServerobj.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, new String[] { null }); 

         } 
         else FileServerobj.execute(); 

        } 

       } 

      } 

     } 
+0

nullを割り当てると問題が解決する可能性があります。 – Adarsh

+0

ansのおかげで..私はやったけど、同じエラー.ois.close(); \t \t \t \t serverSocket.close(); \t \t \t \t serverSocket = null; \t \t \t \t client.close(); \t \t \t \tクライアント= null; – ashunkhs

答えて

0

このロジックは良いと思われます。限り、それは非同期コードです - 私はエラーがこのコードの外のどこかにあると思います。が新しいものを開く前に接続を実際に閉じているかどうか確認してください(時間的に重複しないように)。

+0

私はserverSocketを2回バインドしaccept()します.WebClientIpとすべてを取得するために最初に。そしてもう一度私はクライアントにファイルを送信するためにバインドし、そこにserverSocketを適切に閉じます。私は問題がここにあると思う..私はクライアント側からserverSocketを閉じることができます.. – ashunkhs

+0

あなたはクライアントからサーバーソケットを閉じることはできませんが、クライアントからいくつかのメッセージ(例えば "quit")を送信して、そのようなメッセージを受け取る - あなたはそれを閉じることができます – Nekromancer

関連する問題