2017-05-14 2 views
0

Ich möchte 2 Sammlungen miteinander synchronisieren. Wenn sich auf der Serverseite etwas ändert, werden die verbundenen Clients aktualisiert. Ich habe eine ziemlich grundlegende Frage. Muss ich nun mein Java-Projekt kopieren und den Server in dem einen und den Client in dem anderen programmieren? Aber das klingt nach ziemlich viel unnötiger Arbeit. Kann ich das nicht alles in einem Projekt implementieren und dann Server und Client in einem Hauptfenster starten? Brauche ich Fäden? Ich bin irgendwie fest, was der beste Weg hier ist. Vielen Dank im Voraus.Java Server und Client in einem Programm

+1

Sie müssen 'Threading' hier für eine bessere und effizientere Implementierung verwenden. Nun zur eigentlichen Implementierung können Sie entweder Konzepte von [Socket] (https://docs.oracle.com/javase/tutorial/networking/sockets/definition.html) oder [Remote Method Invocation] (https: // docs .oracle.com/javase/tutorial/rmi /). –

+0

Danke. Ich habe versucht, es wie dieses Beispiel zu machen, aber jetzt habe ich das Problem, wie man den Klienten startet? http://www.oracle.com/technetwork/java/socket-140484.html – vogs

+0

Verweisen [this] (https://www.javatpoint.com/socket-programming). –

Antwort

0

Da codereview meinen Code nicht erlaubt, weil er noch nicht funktioniert, poste ich ihn jetzt hier in der Hoffnung, dass Sie mir helfen können.

public class Server implements Runnable{ 
private String hostName = "127.0.0.1"; 
private int portNumber; 
private ServerSocket serverSocket; 
private Socket clientSocket; 

public Server(int port){ 
    this.portNumber = port; 
} 

public void run(){ 
    String line = ""; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    BufferedReader stdIn = null; 

    try{ 
     this.serverSocket = new ServerSocket(this.portNumber); 
    }catch (IOException e) { 
     System.out.println("Could not listen on port"); 
    } 

    try{ 
     clientSocket = serverSocket.accept(); 
    } catch (IOException e) { 
     System.out.println("Accept failed"); 
    } 

    try{ 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
    }catch (IOException e) { 
     System.out.println("Read failed"); 
    } 

    while(true){ 

     try{ 
      line = in.readLine(); 

     }catch (IOException e) { 
      System.out.println("Read failed"); 
     } 

     System.out.println("line: "+line); 
    } 


} 

protected void finalize(){ 
//Objects created in run method are finalized when 
//program terminates and thread exits 
    try{ 
     serverSocket.close(); 
    }catch (IOException e) { 
     System.out.println("Could not close socket"); 
    } 
} 

}

public class Client implements Runnable{ 
private String hostName = "127.0.0.1"; 
private int portNumber = 6602; 
private Socket clientSocket = null; 

public Client(Socket client){ 
    this.clientSocket = client; 
} 

public Client(int portNumber, String hostName){ 
    this.portNumber = portNumber; 
    this.hostName = hostName; 
} 

public void run(){ 
    String line; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    BufferedReader stdIn = null; 

    try{ 
     if(clientSocket == null) 
      this.clientSocket = new Socket(this.hostName, this.portNumber); 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     out.println("Test string from client"); 
    }catch (IOException e){ 
     System.out.println("in or out failed"); 
    } 

} 

}

public class DebugServerClient { 

public static void testServerClient(){ 
    int port = 6602; 
    Server srv = new Server(port); 
    Client clt = new Client(port, "127.0.0.1"); 

    Thread s = new Thread(srv); 
    s.start(); 

    Thread c = new Thread(clt); 
    c.start(); 


} 

}

habe ich es jetzt auf diese und es scheint zu funktionieren. Ist das ein guter Weg?