2017-10-19 15 views
0

私はこれら2つのJavaソースを使って2台のPC(linuxとmac)の間でファイルを交換しています。 問題はLinuxでのみ表示されます。アドレスは既に使用中です(バインドに失敗しました)

私は、これらの2つのコードを、より多く回想するスレッドで使用しています。

しかし、私はこのエラーがあります:アドレスはすでに使用中です(バインドに失敗しました)。私はこのフォーラムで、TCP接続がまだアクティブであることを検索しました。そのため、サーバソケットのクラスがsetReuseAddress(true)というアドレスの再利用を許可するという機能があります。私はServerSocketのインスタンス化後にこの関数を呼び出しますが、問題は解決しません。 この問題を解決するにはどうすればよいですか?

[EDIT] サーバー

{ 

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

あなたは遅すぎるそれを呼んだためだEDITクライアント

{ 
     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が見えますか?それは最初には機能しますが、2回目には機能しません。私はあなたの指示に従いました..... – narraccino

+0

あなたは* 2つを作成しようとしていますか?あなたはそれをすることはできません。 – EJP

+0

私はAからBへのファイル(キー)を送る必要があり、BはAの鍵をAに送る必要があります。だから私は2つの接続を作成した(私は非常によくメカニズムを知らないので)。それは初めて動作しますが、スレッドを再起動すると、LINUX上でのみこの問題が発生します(ポートがまだ開いているため) – narraccino

関連する問題