Java Projekt - GUI und Netzwerk verknüpfen

sebbi_kaempferisch

Grünschnabel
Hallo,
wir sind zu dritt und schreiben gerade an einem Java Projekt für die UNI.
Vorher haben wir uns die Arbeit in 3 Teile aufgeteilt.
1.GUI
2.Client-/ServerProgrammierung
3.Spielalgorithmen

Es handelt sich um ein Kartenspiel welches man auch im Netzwerk gegeneinander spielen kann.
Hier im Beispiel: angenommen es haben sich 3 Clienten als Spieler angemeldet und der Server spielt auch mit..

Das Probelm: Die Verbindung vom Server und Clienten steht, die Streams sind definiert. Man soll als Client einen Nickname eingeben können, dieser soll in einem anderen GUI-Fenster (auch andere Klasse!!) ausgegeben werden.

Meine Frage: Wie kann ich mir die Eingabe holen (get....), den String als Paket an den Server senden...dann muss dieser ja den String an die Clienten zurückschicken und in dem Ausgabefenster ausgeben (auf einem Label). Das Ziel ist das bevor der Server das Spiel freigibt, eine Liste mit allen Teilnehmer entsteht..

Kann uns jemand weiterhelfen
Würde uns auch über Links oder eventuelle Verweise auf andere Threads freuen..

Sollte meine Erklärung nicht ausreichen, bitte kurz posten, bin die ganze Zeit online und kann sofort Verständnissprobleme klären.. weiß ja wie das ist, wenn man sich alles schon vorstellen kann ist es immer wesentlich leichter ;)

Vielen Dank!
 
Servus.

Vielleicht ist es einfacher, wenn du den Code postest!?
Also nicht den ganzen. Aber die Schlüsselstellen.
Oder du schreibst einfach was ihr wie (Verbindung, stream) realisiert habt.
 
ok,
wir haben es mit Input und Output Streams realisiert..
Es gibt 4 Klassen: Server, ServerDienst, Client, ClientDienst..
Die Dienst Klassen realisieren den Thread der im Hintergrung läuft..
Ich füge hier eben alle die 4 Klassen ein:

Server.java:
Code:
import java.net.*;
import java.io.*;

public class Server extends Thread 
{
	boolean stoprequested;
	int counter = 0;
	ServerSocket echod;
	InputStream in;
	OutputStream out;
	Socket[] socket = new Socket[4];
	ServerDienst outThread;
	
	
	Server()
	{
		try
		{
			echod = new ServerSocket(8);
			this.stoprequested = false;
		} catch (IOException e)
		{
			System.err.println("Fehler bei Konstruktor EchoServer: " + e.toString());
		}
	}
	
	public synchronized void requestedStop()
	{
		stoprequested = true;
	}
	
	public void run()
	{
		try
		{
			do
			{
				socket[counter] = echod.accept();
				in = socket[counter].getInputStream();
				outThread.start();
				sendString(socket[counter], "[EchoServer says: Connection #" + counter + " accepted");
				counter++;
			}while (counter < 4 || !stoprequested);
		}catch ( IOException e)
		{
			System.err.println("Fehler bei ServerThread.run(): " + e.toString());
		}
	}
	
	public void sendString(Socket socket, String sendString)
	{
		try
		{
			System.out.println("gesendet: " + sendString);
			out = socket.getOutputStream();
			String line = (sendString);
			out.write(line.getBytes());
			out.write('~');
		} catch (IOException e)
		{
			System.err.println("Fehler bei sendString(): " + e.toString());
		}
	}

}


ServerDienst:
Code:
import java.net.*;
import java.io.*;

public class Server extends Thread 
{
	boolean stoprequested;
	int counter = 0;
	ServerSocket echod;
	InputStream in;
	OutputStream out;
	Socket[] socket = new Socket[4];
	ServerDienst outThread;
	
	
	Server()
	{
		try
		{
			echod = new ServerSocket(8);
			this.stoprequested = false;
		} catch (IOException e)
		{
			System.err.println("Fehler bei Konstruktor EchoServer: " + e.toString());
		}
	}
	
	public synchronized void requestedStop()
	{
		stoprequested = true;
	}
	
	public void run()
	{
		try
		{
			do
			{
				socket[counter] = echod.accept();
				in = socket[counter].getInputStream();
				outThread.start();
				sendString(socket[counter], "[EchoServer says: Connection #" + counter + " accepted");
				counter++;
			}while (counter < 4 || !stoprequested);
		}catch ( IOException e)
		{
			System.err.println("Fehler bei ServerThread.run(): " + e.toString());
		}
	}
	
	public void sendString(Socket socket, String sendString)
	{
		try
		{
			System.out.println("gesendet: " + sendString);
			out = socket.getOutputStream();
			String line = (sendString);
			out.write(line.getBytes());
			out.write('~');
		} catch (IOException e)
		{
			System.err.println("Fehler bei sendString(): " + e.toString());
		}
	}

}

Client:
Code:
import java.net.*;
import java.io.*;

public class Client extends Thread
{
	InputStream in;
	OutputStream out;
	Socket socket;
	ClientDienst outThread;
	String ownName, host;
	

	Client(String host, String ownName)
	{
		this.ownName = ownName;
		this.host = host;
	}
	
	public void run()
	{
		try
		{
			socket = new Socket(host, 8);
			in = socket.getInputStream();
			outThread = new ClientDienst(in);
			outThread.start();
			sendString(ownName);
		}catch (IOException e)
		{
			System.err.println("Fehler im run() vom ClientDienst: " + e);
		}
	}
	
	public void sendString(String sendString)
	{
		try
		{
			System.out.println("gesendet: " + sendString);
			out = socket.getOutputStream();
			String line = sendString;
			out.write(line.getBytes());
			
		} catch (IOException e)
		{
			System.err.println("Fehler beim senden des Strings: " + e);
		}
	}
	
}

ClientDienst:
Code:
import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;

public class ClientDienst extends Thread
{
	InputStream in;
	boolean stoprequested;
	static String x = "", clientName, clientIP, fragetyp, frage;
	
	public ClientDienst(InputStream in)
	{
		super();
		this.in = in;
		stoprequested = false;
	}
	
	public synchronized void requestedStop()
	{
		stoprequested = true;
	}
	
	public void run()
	{
		int len = 0;
		try
		{
			while (!stoprequested)
			{
				try
				{
					int c;
					while ((c = in.read()) != -1 )
					{
						if(c == '~')
						{
							break;
						}
						x += (char) c;
					}
					
					saveString();
					x = "";
					
				} catch (InterruptedIOException e)
				{}
			}
		} catch (IOException e)
		{
			System.err.println("OutputThread: " + e.toString());
		}
	}
	
	public String saveString()
	{
		return ("Hier werden mal Strings versendet");
	}

}
 
Hallo,

nur so als Ideenstütze. Wieso definierst du dir nicht ein NetworkListener
Interface mit einer Methode dataReceived oder so.
Ungefähr so:

Java:
interface NetworkListener{
    public void dataReceived(String data);
}

interface NetworkDevice extends Runnable{
    public void addNetworkListener(NetworkListener toAdd);
}

class Server implements NetworkDevice{
    private NetworkListener l;
    private boolean dataReceived;
    private String data;

    public void run(){
        //...
        if(dataReceived){
            l.dataReceived(data);
        }
    }
    public void addNetworkListener(NetworkListener toAdd){
        l = toAdd;
    }
}

class Client implements NetworkDevice{
    private NetworkListener l;
    private boolean dataReceived;
    private String data;

    public void run(){
        //...
        if(dataReceived){
            l.dataReceived(data);
        }
    }

    public void addNetworkListener(NetworkListener toAdd){
        l = toAdd;
    }
}

class GUIDummy{

    private NetworkDevice net;

    GUIDummy(boolean client){
        if(client)
            net = new Client();
        else
            net = new Server();
        net.addNetworkListener(new NetworkListener(){
            public void dataReceived(String data){
                //updateGUI(data);
            }
        });
        new Thread(net).start();
    }
}

Gruß

RedWing
 
Hallo,

ich meine auch nicht die Klasse NetworkDevice aus java.net.
Schau dir doch bitte mal den kompletten Sourcecode an. Da hab ich ein
Interface namens NetworkDevice definiert. Das kannst du nat auch umbnenennen
wenn du magst.

Gruß

RedWing
 
Zurück