2017-10-19 26 views
0

J'utilise ces deux sources java pour échanger un fichier entre 2 PC (linux et mac). Le problème est affiché uniquement sur Linux. J'utilise ces 2 codes dans un fil où je me rappelle plusieurs fois.Adresse déjà utilisée (liaison échouée)

Mais j'ai cette erreur: Adresse déjà utilisée (échec de liaison). J'ai cherché sur le web et sur ce forum que le problème est la connexion TCP encore active, donc il y a une fonction de la classe Server Socket appelée setReuseAddress (true) qui me permet de réutiliser l'adresse. J'appelle cette fonction après l'instanciation de ServerSocket mais les problèmes persistent. Comment puis-je résoudre ce problème?

[EDIT] serveur

{ 

     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 client

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

     } 

    } 

Répondre

1

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

C'est parce que vous l'avez appelé trop tard. Vous devriez avoir observé que l'exception a été lancée avant l'appel. Vous devez séparer la création de la liaison:

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

NB votre code de copie doit être la même aux deux extrémités, et non comme une ou l'autre version que vous avez utilisé, qui présentent divers problèmes et sophismes:

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

J'ai modifié le code (copier le code (client) et le serveur) mais le problème persiste, Pouvez-vous voir le nouveau code EJP? Cela fonctionne à la première fois, mais la deuxième fois non. J'ai suivi vos instructions ..... – narraccino

+0

Essayez-vous de créer * deux * d'entre eux? Tu ne peux pas faire ça. – EJP

+0

Je dois envoyer un fichier (la clé) de A à B et B doit envoyer à A sa clé. J'ai donc créé 2 connexions (car je ne connais pas très bien le mécanisme). Cela fonctionne pour la première fois, mais quand je redémarre le fil j'ai ce problème SEULEMENT sur LINUX (parce que le port est toujours ouvert) – narraccino