Datenaustausch zweier rechner

  • Themenstarter Themenstarter Nabralanca
  • Beginndatum Beginndatum
N

Nabralanca

Gast
Heyhey^^

ums gleich vornewegzunehmen, ich habe mich an der suche des Forums versucht, bin aber iwie dran gescheitert 🙂 und die gefundenen Threats haben mir auch net ganz geholfen.

Folgende Situation: Wir in der Schule müssen im Informatik unterricht ein Spiel programmieren. Ich habe ein einfaches game vor, was aber einen Multiplayer haben soll (sowas wie jump and run gegeneinander). Wir programmieren mit Eclipse und Java applets.

Wie kann ich nun Daten zwischen zwei Programmen auf zwei verschiedenen rechnern via Internet austauschen?
(Ip adresse und port ist bekannt)

Ich habe es schon geschafft via sockets eine Verbindung zwischen zwei servern aufzubauen: (aus nem i-net tutorial kopiert)
client :

Java:
public static void main(String[] args) throws IOException {

        Socket Socket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            Socket = new Socket("192.168.178.21", 4444);
            out = new PrintWriter(Socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(Socket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("No Host");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("No Connection");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromUser;

        
        while ((fromServer = in.readLine()) != null) {
            System.out.println("Server: " + fromServer);
            if (fromServer.equals("Bye."))
                break;
		    
            fromUser = stdIn.readLine();
	    if (fromUser != null) {
                System.out.println("Client: " + fromUser);
                out.println(fromUser);
	    }
        }

        out.close();
        in.close();
        stdIn.close();
        Socket.close();
    }

und als server:
Java:
public static void main(String[] args) throws IOException {

		 ServerSocket serverSocket = null;
	        try {
	            serverSocket = new ServerSocket(4444);
	            System.out.println("Erfolgreich erstellt");
	        } catch (IOException e) {
	            System.err.println("Could not listen on port: 4444.");
	            System.exit(1);
	        }

	        Socket clientSocket = null;
	        try {
	            clientSocket = serverSocket.accept();
	            System.out.println("Socket aufgenommen");
	        } catch (IOException e) {
	            System.err.println("Accept failed.");
	            System.exit(1);
	        }

	        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
	        BufferedReader in = new BufferedReader(
					new InputStreamReader(
					clientSocket.getInputStream()));
	        String inputLine, outputLine;
	        KnockKnockProtocol kkp = new KnockKnockProtocol();

	        outputLine = kkp.processInput(null);
	        out.println(outputLine);



		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String ins = null;


		while ((inputLine = in.readLine()) != null) {
			System.out.println("schleife");
			outputLine = kkp.processInput(inputLine);
			String s = "";
			try {
				while ((ins = br.readLine()) != null) {
					s = ins;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			//Anfrage vom Client ausgeben
			System.out.println("Client : "+inputLine);
			out.println(s);
			if (inputLine.equals("Bye."))
				break;
		}
		Console.class.getMethods();
		out.close();
		in.close();
		clientSocket.close();
		serverSocket.close();
	}

damit kann ich von einem rechner anfragen auf den server schicken, der mir dann antwortet.

Um zum Thema zurückzukommen: wie kann ich das jetzt umbauen zu dem prinzip:
a sendet b nen befehl
b empfängt befehl und wertet ihn aus
b führt befehl aus
?

Danke schonmal für antworten^^
 
Auf mich kommt auch bald ein ähnliches Projekt zu, dies aber im Rahmen eines Studiums mit einer Gruppe aus anderen Informatikstudenten.
Bist du dir denn sicher, dass es einen Multiplayer haben muss?
Wenn du nämlich schon den Austausch aus einem Tutorial kopieren musst sieht das ganze am Ende wohl eher nach einer Frickellösung aus.
Alleine die ganze hintergrundgeschichte und synchronisation etc wird euch noch vor einige Probleme stellen.
 
Ich fände es halt ein nettes Feature^^

Da das ganze als Seminar projekt angelegt ist hab ich auch noch ein Jahr zeit 🙂

Aber wie läuft so ein Prozess eigentlich grundliegend ab?
Also ein Datenaustausch, sagen wir ein einfaches Chatprogramm.

Kann mir vlt wer so ne art pseudo code geben?
 
ablauf bei einem chat:
client verbindet sich zum server (über socket)
der server erstellt für den clienten sofort einen neuen Handling thread, der alles andere macht
jeder client ist in einer liste beim server eingetragen
schickt nun ein user eine nachricht ab wird diese vom ihm zugeteilten serverThread empfangen. jeder dieser threads hat eine methode sendMessage, diese schicken an den user, mit dem es verbunden ist eine nachricht die dort ausgegeben wird.
Nun ruft der Thread systematisch in einer Schleife alle threads auf und ruft dort die sendMessage(nachricht) Methode auf.
Somit erhält jeder user die nachricht.

Das war jetzt ganz simple normal wird da etwas mehr gemacht, aber so würde es schon funktionieren

ein paar code zeilen
Java:
//client stellt verbindung her (port :int; ip: string):
Socket sok = new Socket(ip, port)
//in und output streams
InputStream input = sok.getInputStream();
br = new BufferedReader(new InputStreamReader(input));
pw = new PrintWriter(sok.getOutputStream());

//auf der anderen seit (server)
//verbindungen annehmen 
//Serversocket, dass auf einen port hört (port : int)
ServerSocket = new ServerSocket(port);

//live ist ein boolean der beim ausschalten des progs oder wenn zu viele leute verbunden sind auf false gesetzt wird
while(live){
//eingehende verbindungen annehmen
Socket client = server.accept();
String hostName = client.getInetAddress().getHostName();

//neuen thread starten, der für diesen clienten verantwortlich ist, der von mir erstellte thread erwartet das socket und eine ip des users, die ja vorhin ausgelesen wurde
ChatHandler cl = new ChatHandler(client, hostName);

//neuen Thread (cl) in die liste eintragen (clients ist eine ArrayList)
clients.add(cl);
//starten des threads, der mit dem clienten komunizieren soll
cl.start();

}
//das sollte als ansatz reichen, denke ich zumindest
 
Zuletzt bearbeitet:

Zurück
Oben