2016-06-23 46 views
0

我正嘗試使用套接字通信從兩側發送文件。我創建了一個serverSocket對象並創建連接。 client = serverSocket.accept(); 現在我可以從兩面發送文件,但只能發送一次。當我斷開並重新我收到錯誤:綁定失敗: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

請嘗試分配空值可能是它可以解決您的問題。 – Adarsh

+0

謝謝你..我做了,但仍然是相同的錯誤..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兩次..第一次獲得WiFiClientIp和所有..然後我綁定發送文件到客戶端,並在那裏我正確關閉serverSocket。我認爲問題在這裏..我可以從客戶端關閉serverSocket .. – ashunkhs

+0

你不能只關閉客戶端的服務器套接字,但你可以從客戶端發送一些消息(如「退出」),然後如果服務器收到這樣的信息 - 你可以關閉它 – Nekromancer

相關問題