2017-10-19 111 views
0

我正在使用這兩個java源文件在2臺PC(linux和mac)之間交換文件。 該問題僅在Linux上顯示。已在使用中的地址(綁定失敗)

我在一個線程中使用這兩個代碼,我回憶更多次。

但是我有這個錯誤:地址已經在使用(綁定失敗)。 我已經在網上搜索,並在這個論壇上,問題是TCP連接仍然活躍,所以有一個類服務器套接字的函數稱爲setReuseAddress(true)它允許我重用該地址。在ServerSocket實例化之後我調用這個函數,但問題依然存在。 我該如何解決這個問題?

[編輯] 服務器

{ 

     final int SOCKET_PORT = 13267; 
     final String FILE_TO_SEND = "/Users/jo/Desktop/cryptedSymmetric.key"; 
     boolean flag = true; 
     FileInputStream fis = null; 
     BufferedInputStream bis = null; 
     OutputStream os = null; 
     ServerSocket servsock = null; 
     Socket sock = null; 

     try { 
      servsock = new ServerSocket(); // create unbound ServerSocket 
      servsock.setReuseAddress(true); 
      servsock.bind(new InetSocketAddress(SOCKET_PORT)); 

      // while (flag) { 
      System.out.println("SO_REUSEADDRESS is enabled: " + servsock.getReuseAddress()); 
      System.out.println("Waiting client B..."); 
      try { 
       sock = servsock.accept(); 
       System.out.println("Connection : " + sock); 
       // send file 
       File myFile = new File(FILE_TO_SEND); 
       byte[] mybytearray = new byte[(int) myFile.length()]; 
       fis = new FileInputStream(myFile); 
       bis = new BufferedInputStream(fis); 
       bis.read(mybytearray, 0, mybytearray.length); 
       os = sock.getOutputStream(); 
       System.out.println("Invio del file " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)"); 
       os.write(mybytearray, 0, mybytearray.length); 
       os.flush(); 
       System.out.println("Done."); 
       flag = false; 
      } finally { 
       if (bis != null) 
        bis.close(); 
       if (os != null) 
        os.close(); 
       if (sock != null) 
        sock.close(); 
      } 
      // } 
     } finally { 
      if (servsock != null) 
       servsock.close(); 

      return flag; 
     } 
    } 

編輯客戶

{ 
     int SOCKET_PORT = 0; 
     SOCKET_PORT = 13267; 
     // final String SERVER = "192.168.1.2"; 
     final String FILE_TO_RECEIVED = "/Users/jo/Desktop/publicB.key"; 
     final int FILE_SIZE = 6022386; 
     boolean flag = true; 

     int bytesRead; 
     int current = 0; 
     FileOutputStream fos = null; 
     BufferedOutputStream bos = null; 
     Socket sock = null; 
     try { 
      sock = new Socket(address.getHostAddress(), SOCKET_PORT); 
      System.out.println("Connessione..."); 

      // receive file 
      byte[] mybytearray = new byte[FILE_SIZE]; 
      InputStream is = sock.getInputStream(); 
      fos = new FileOutputStream(FILE_TO_RECEIVED); 
      bos = new BufferedOutputStream(fos); 
      // bytesRead = is.read(mybytearray, 0, mybytearray.length); 
      // current = bytesRead; 
      int count; 
      while ((count = is.read(mybytearray)) > 0) { 
       bos.write(mybytearray, 0, count); 
      } 



      bos.flush(); 
      System.out.println("File " + FILE_TO_RECEIVED + " scaricato (" + current + " bytes letti)"); 
      flag = false; 
     } finally { 
      if (fos != null) 
       fos.close(); 
      if (bos != null) 
       bos.close(); 
      if (sock != null) 
       sock.close(); 

      return flag; 

     } 

    } 

回答

1

I call this function after the instantiation of ServerSocket but the problems persists.

那是因爲你把它叫做爲時已晚。你應該觀察到異常在調用之前被拋出。你需要從分離的結合創造:

servsock = new ServerSocket(); // create unbound ServerSocket 
servsock.setReuseAddress(true); 
servsock.bind(new InetSocketAddress(SOCKET_PORT)); 

NB您的副本代碼應該是在兩端是相同的,而不是像兩個版本你使用,其表現出的各種問題和謬誤:

while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 
+0

我修改了代碼(複製代碼(客戶端)和服務器),但問題仍然存在,你能看到新的代碼EJP嗎?它在第一次運作,但第二次運作。我遵循你的指示..... – narraccino

+0

你想創造*兩*他們?你不能那樣做。 – EJP

+0

我必須發送文件(密鑰)從A到B,B必須發送給A的密鑰。所以我創建了2個連接(因爲我不太清楚機制)。它第一次工作,但是當我重新啓動線程時,我只有在LINUX上有這個問題(因爲端口仍然打開) – narraccino

相關問題