2017-03-15 1 views
-1

Je suis nouveau dans la programmation socket. J'aimerais lire les données des fichiers locaux et les envoyer au serveur par le socket. Lors des tests avec la même machine (le client et le serveur sont sur un ordinateur), cela fonctionne. Mais si je teste le serveur dans la machine distante, je n'ai pas obtenu les données que je devrais obtenir de la machine client. Tout le monde peut m'aider à regarder mon code? Merci beaucoup!Java Socket: les données ne sont pas transférées

public class GreetingClient{ 
private Socket socket; 

public GreetingClient(String serverName, int port) throws UnknownHostException, IOException { 
    this(new Socket(serverName,port)); 
} 


public GreetingClient(Socket socket) { 
    this.socket = socket; 
} 
public static void main(String[] args) { 
    String hostname; 
    int port; 
    if (args.length == 2) { 
     hostname = args[0]; 
     port = Integer.parseInt(args[1]); 

    } else { 
     hostname = "localhost"; 
     port = 6066; 
    } 
    System.out.println("Connecting to " + hostname + " on port " + port); 
    String filePath ="C:/Users/Documents/file.xml"; 
    GreetingClient c; 
    try { 
     c = new GreetingClient(hostname, port); 
     c.send(filePath); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
public void send(String filePath) throws IOException { 
    InputStream inputStream = new FileInputStream(filePath); 
    IOUtils.copy(inputStream , this.socket.getOutputStream()); 
    this.socket.getOutputStream().flush(); 
    this.socket.shutdownOutput(); 
    System.out.println("Finish sending file to Server."); 
} 
} 




public class GreetingServer extends Thread { 
private ServerSocket serverSocket; 
public GreetingServer(int port) throws IOException { 
    serverSocket = new ServerSocket(port); 
} 
public void run() { 
    while (true) { 
     try { 
      System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 
      Socket server = serverSocket.accept(); 

      System.out.println("Just connected to " + server.getRemoteSocketAddress()); 
      if (!server.isClosed()) { 
       DataOutputStream out = new DataOutputStream(server.getOutputStream()); 
       out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\n Goodbye!"); 
      } 
      DataInputStream in = new DataInputStream(server.getInputStream()); 
      if (in != null) { 
       Upload upload = parseXmlToJaxb(in); 
       long clientID = upload.getClientID(); 
       System.out.println("Client "+clientID); 


       server.close(); 
      } else { 
       System.out.println("Unknown Message Received at " + _dateTimeFormatter.format(new Date())); 
      } 
     } catch (SocketTimeoutException s) { 
      System.out.println("Socket timed out!"); 
      break; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      break; 
     } 
    } 
} 
+0

* Je n'ai pas obtenu les données que je devrais *. - De quelle façon? Les mauvaises données? Pas de données? Données corrompues? –

+0

Je supprimerais beaucoup de code jusqu'à ce que votre juste gauche avec un client et un serveur, où le client envoie juste un octet simple au serveur, et voir si cela fonctionne. Ensuite, ajoutez lentement l'autre code. –

Répondre

0

Dans votre méthode d'envoi, vous ne lisez aucune donnée de l'InputStream. Lorsque vous appelez cela new FileInputStream(filePath) dans son constructeur, un nouveau fichier() avec le chemin cible est créé. Pour obtenir des données, vous devez les lire dans InputStream et ensuite, vous pouvez les écrire dans OutputStream. Donc, je pense que vous devez corriger votre méthode d'envoi.