Zurück   Flashforum > Flex und AIR > Flex allgemein

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 03-01-2011, 09:57   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
BlazeDS und Spaß mit Remoteobject

Nachfolgenden Text hab ich bereits in einem kleinen privaten Forum geschrieben, ist immernoch aktuell, leider

Kurz beschrieben: Wir brauchen für ein Multiplayerspiel eine Lobby, in der Spieler sich auswählen können und verbinden. Genutzt werden Socketverbindungen.

Bedingung: Server Java, Client Flash, als Server-framework BlazeDS

Hoffe ihr könnt mir helfen.

ps.: Falls ich im falschen Forum bin, bitte umschieben...die Unterforennamen waren für mich nicht ganz eindeutig.

-------------------------------------------------------------------

Tach Leute,
wir verzweifeln gerade seit nun guten 3 Wochen an dem gleichen Problem und haben keine Ansätze mehr, was man ausprobieren könnte.

Idee: Wir wollen ein Multiplayerspiel machen mit Socketverbindung. Bevor 2 zusammen Spielen, müssen sie sich über eine Liste, die im Startbildschirm angezeigt werden soll, auswählen und verbinden.

Stand: Unser Java-server wartet auf Verbindungen und wenn ein Client gestartet wird, speichert er die Verbindungen mit einer ID in eine Liste.

Der Flash-client (mxml) führt die Methode z.B. listeSchicken aus und bekommt eine Liste mit Objekten zurück, worin wiederum die ID steht, die wird dann ins Datagrid geschrieben.

Problem: Die Liste wird nur dann ins Datagrid geschrieben, wenn wir manuell liste.add(Object(900)); schreiben. Sobald wir die Liste aber per liste.add(Object(getId(variable); füllen, also aus der Verbindungenliste auslesen, dann überträgt der Server scheinbar nichts an das Datagrid. Die Liste bleibt einfach leer.

Vielleicht ist jeman von euch ja da firm...bzw hat sowas ähnliches bei einem Projekt gemacht? Dieses Userliste-problem dürfte eigentlich nicht so schwer sein...

Hier mal der code:
Code:
package flex.samples.verbindungen;

import java.util.ArrayList;
import java.util.List;

import flex.samples.product.Product;

//import TaggedConnection;

public class ListeSchicken {
	//private ArrayList<TaggedConnection> connections;

//	public ListeSchicken(ArrayList<TaggedConnection> conList) {
//		connections = conList;
//	}

	public List<String> listeSchicken() {
		List verbindungen = new ArrayList();

		for(TaggedConnection con:EntranceServer.conList){
			verbindungen.add(new RaumPilot(con.getId()));
		}
		return verbindungen;
	}

}
Code:
package flex.samples.verbindungen;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 
 * 
 * 
 *         Eingangserver wartet auf Socketverbdinungen und speichert sie in
 *         einer Connection-Liste(conList) als TaggedConnection-Typ ab.
 * 
 */
public class EntranceServer {
	static ArrayList<TaggedConnection> conList = new ArrayList();
	static ServerSocket server;
	static int id = 1000;
	List geschwader = new ArrayList();
	

	// ListeSchicken liste=new ListeSchicken(conList);

	public static void main(String[] args) {
		// ServerSocket server;
		System.out.println("Main");
		listenSocket();

	}

	/**
	 * listenSocket() wartet auf Socketverbindungen über den Port 2001 und
	 * speichert sie gegebenenfalls ab. Das TaggedConnection Objekt bekommt 2
	 * Eigenschaften: die Socketverbindung und eine ID. Zum Test wird nach 2
	 * bestehenden Verbindungen in der Liste, ein GameThread gestartet.
	 */
	public static void listenSocket() {
		System.out.println("listenSocket");
		try {
			server = new ServerSocket(2001);
			System.out.println("Server waits for connections.");
		} catch (IOException e) {
			System.out.println("Could not listen on port 2001");
			System.exit(-1);
		}
		while (true) {
			TaggedConnection t;
//			if (conList.size() == 2) {
//				GameThread testChat = new GameThread((TaggedConnection) conList
//						.get(0), (TaggedConnection) conList.get(1));
//				testChat.start();
//				System.out.println("Verbindung hergestellt!");
//			}

			try {
				// server.accept returns a client connection
				t = new TaggedConnection(server.accept(), id);
				System.out.println("new Connection established. id: " + id);
				VerbindungenHandler handler=new VerbindungenHandler(t);
				handler.start();
				conList.add(t);
		
				System.out.println("Nummer in Liste: " +conList.get(conList.size()-1).getId());
				printHello(t);
				id = getNewId();
				System.out.println("Anzahl der Connections:" + conList.size());

			} catch (IOException e) {
				System.out.println("Accept failed: 4444");
				System.exit(-1);
			}
		}
	}

	private static int getNewId() {
		Random r = new Random();
		int ir = r.nextInt(1000);
		int newId = ir + 1000;
		return newId;
	}
	
	public List getList() {
//		System.out.println("Ich bin in getList");
//		conList.add(new TaggedConnection(null, 909));
//		conList.add(new TaggedConnection(null, 908));
//		conList.add(new TaggedConnection(null, 907));
//		conList.add(new TaggedConnection(null, 906));
		List rekruten=new ArrayList();
//		for (int i=0;i<conList.size();i++){
//			rekruten.add(new RaumPilot(conList.get(i).getId()));
//		}


		return rekruten;
	}

}
Code:
package flex.samples.verbindungen;

import java.io.Serializable;

public class RaumPilot implements Serializable {
	private int rekrudNr;

	public RaumPilot(int id) {
		this.rekrudNr = id;
	}

	public int getRekrudNr() {
		return rekrudNr;
	}

	public void setRekrudNr(int rekrudNr) {
		this.rekrudNr = rekrudNr;
	}

}
Falls ihr noch mehr sehen wollt, kann ich gerne liefern. Denke aber fast, dass es ein grundsätzliches Problem gibt.

Danke für die Aufmerksamkeit

Geändert von Milchsuppe (03-01-2011 um 10:19 Uhr)
Milchsuppe ist offline   Mit Zitat antworten
Alt 03-01-2011, 10:05   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.142
Wieso nutzt du schreibst du einen eigenen SocketServer, wenn du Blaze nutzen willst?
Omega Psi ist offline   Mit Zitat antworten
Alt 03-01-2011, 10:15   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
Zitat:
Zitat von Omega Psi Beitrag anzeigen
Wieso nutzt du schreibst du einen eigenen SocketServer, wenn du Blaze nutzen willst?
Also wir hatten, bevor wir uns mit Blaze auseinandergesetzt haben, den Socketserver geschrieben.

Dass wir Blaze benutzen, liegt auch nur am Prof.

Es gibt bei Blaze also direkt einen Socketserver der Socketverbindungen verwaltet? Hast du vielleicht einen Link zu Material dafür? Und wenn ja, hilft mir das bei dem Lobby-problem?

Ich hab nämlich nicht den Eindruck, dass unser Socketserver das Problem ist/war.
Milchsuppe ist offline   Mit Zitat antworten
Alt 03-01-2011, 20:53   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.142
  1. Was ist das Lobby Problem?
  2. Bitte entschuldige, aber der Code ist nicht gerade der lesbarste. Wie dürft ihr deutsche Bezeichner verwenden und wieso werden Generics nur ein bisschen verwendet?
  3. Welche Stelle im Code, die manuell befüllt wird, meinst du? Falls du die conList meinst, die ist ja unter Umständen leer.
    Code:
    public List<RaumPilot> getRecruitsForConnections(List<TaggedConnection> connections) {
    
        if (connections == null || connections.size() == 0) {
          return new ArrayList<RaumPilot>();
        }
    
        List<RaumPilot> rekruten = new ArrayList<RaumPilot>();
    
        for (TaggedConnection connection : connections) {
          rekruten.add(new RaumPilot(conList.get(i).getId()));
        }
    
        return rekruten;
    }
    Einfach mal einen breakpoint setzen im Methoden Aufruf und schauen, was passiert.
  4. Ich verstehe den Code auch immer weniger, je öfter ich ihn lese. Wo habt ihr den her? Also, auf welcher Grundlage basiert der Server?

Viel mir gerade auf: in while (true) instanziiert ihr definitiv zu oft einen GameThread.

Und es ist wirklich nur eine Bitte, aber denkt daran, dass andere euren Code auch lesen sollen - offensichtlich. Da macht es Sinn den Code etwas zu pflegen. Sonst macht das durchlesen keinen Spass.
Omega Psi ist offline   Mit Zitat antworten
Alt 04-01-2011, 09:36   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
Hi und danke erstmal, dass du dich versuchst durch unseren - zugegeben - schlecht dokumentierten code zu wühlen.

Zitat:
Zitat von Omega Psi Beitrag anzeigen
Was ist das Lobby Problem?
Nochmal zur Verdeutlichung unseres Problems: Wir wollen ein Spiel für 2 Spieler machen. Bevor man zusammen spielt, trift man sich in einer Lobby. Was nichts anderes ist, als eine Liste von möglichen Mitspielern (Raumpiloten). Die sollte man auswählen können und auf "Verbinden" drücken können, damit die beiden Socketverbindungen (welche schon bestehen, ab dem Zeitpunkt, wo sie den Client starten) zusammen geworfen werden und ein GameThread für sie gestartet wird.


Zitat:
Zitat von Omega Psi Beitrag anzeigen
Bitte entschuldige, aber der Code ist nicht gerade der lesbarste. Wie dürft ihr deutsche Bezeichner verwenden und wieso werden Generics nur ein bisschen verwendet?
Stimmt, wir haben den typischen Anfängerfehler gemacht, nicht gleich zu dokumentieren, was die Methoden etc. anstellen...sorry dafür, ich versuch das noch nachzuholen.

Deutsche Bezeichner einfach aus dem Grund, weil wir da viel rumprobiert haben, und die Namen dann einfach aus Faulheit fix gewählt wurden...nicht toll, zugegeben :[

Generics: Das ist eins der Probleme die uns beschäftigen. Wir hatten da schon alle möglichen Versionen. Sprich wir haben auch mal alle Typen direkt vorgegeben, es hat aber nichts geändert, bzw. gab andere Probleme.

Wir schätzen, dass das Hauptproblem ist, dass die Liste static sein muss (static ArrayList<TaggedConnection> conList = new ArrayList();
)

Zitat:
Zitat von Omega Psi Beitrag anzeigen
Welche Stelle im Code, die manuell befüllt wird, meinst du? Falls du die conList meinst, die ist ja unter Umständen leer.
Code:
public List<RaumPilot> getRecruitsForConnections(List<TaggedConnection> connections) {

    if (connections == null || connections.size() == 0) {
      return new ArrayList<RaumPilot>();
    }

    List<RaumPilot> rekruten = new ArrayList<RaumPilot>();

    for (TaggedConnection connection : connections) {
      rekruten.add(new RaumPilot(conList.get(i).getId()));
    }

    return rekruten;
}
Einfach mal einen breakpoint setzen im Methoden Aufruf und schauen, was passiert.
Das ist das Problem: die Liste ist nachweisbar nicht leer. Wir haben die size ausgeben lassen und die ist nicht 0.

Zitat:
Zitat von Omega Psi Beitrag anzeigen
Ich verstehe den Code auch immer weniger, je öfter ich ihn lese. Wo habt ihr den her? Also, auf welcher Grundlage basiert der Server?
Grundlage des Socketservers war ein einfaches Tutorial mit einem Chat. Darauf aufgebaut haben wir die Verbindungen dann in eine Liste geschrieben usw. usf.

Zitat:
Zitat von Omega Psi Beitrag anzeigen
Viel mir gerade auf: in while (true) instanziiert ihr definitiv zu oft einen GameThread.
Der Gamethread soll nur gestartet werden, wenn 2 Leute miteinander spielen wollen...und die brauchen wohl auch zwangsweise jeweils einen eigenen Thread?

Zitat:
Zitat von Omega Psi Beitrag anzeigen
Und es ist wirklich nur eine Bitte, aber denkt daran, dass andere euren Code auch lesen sollen - offensichtlich. Da macht es Sinn den Code etwas zu pflegen. Sonst macht das durchlesen keinen Spass.
Ja du hast vollkommen recht...entschuldigung

Nochmal abschließend vielleicht eine Frage: Gibt es dazu vielleicht schon Tutorials/Beispiele? Ich denke jedes Multiplayerspiel brauch diese Funktion und deswegen war ich eigentlich guter Dinge etwas zu finden...allerdings ist es schwierig gerade für die Kombination (java, flash) etwas passendes per Google zu finden...vielleicht kennst du/ihr ja eine gute Seite die sowas schon in der Art hat, an dem wir uns orientieren können?

Danke auf jedenfall für deine Mühe.
Milchsuppe ist offline   Mit Zitat antworten
Alt 04-01-2011, 12:03   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.142
Zitat:
Zitat von Milchsuppe Beitrag anzeigen
Der Gamethread soll nur gestartet werden, wenn 2 Leute miteinander spielen wollen...und die brauchen wohl auch zwangsweise jeweils einen eigenen Thread?
Ich würde sagen, nein. Ein Thread mit einer Menge von Assoziationen zwischen Clients sollte reichen. Bei Applikationen wie Habbohotel dürfte das sonst der Tod sein. Das ist meine Vermutung.

Zitat:
Zitat von Milchsuppe Beitrag anzeigen
Nochmal abschließend vielleicht eine Frage: Gibt es dazu vielleicht schon Tutorials/Beispiele? Ich denke jedes Multiplayerspiel brauch diese Funktion und deswegen war ich eigentlich guter Dinge etwas zu finden...allerdings ist es schwierig gerade für die Kombination (java, flash) etwas passendes per Google zu finden...vielleicht kennst du/ihr ja eine gute Seite die sowas schon in der Art hat, an dem wir uns orientieren können?
Schaue dir mal den die tunrkey distribution an: BlazeDS 30 minutes test drive
Omega Psi ist offline   Mit Zitat antworten
Alt 04-01-2011, 12:36   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
Also ich hab jetzt nochmal 2 andere Tutorials zu RPC und AMF gemacht. Aufgefallen ist mir (ein wohl ziemlich dilletantischer) Fehler: Wir haben bei uns kein Gegenstück auf Flash-seite von dem Value-object gemacht.

Ich verfolge jetzt erstmal diese Idee und melde mich, falls ich dann wieder nicht weiterkomme...trozdem danke nochmal für die Hilfe
Milchsuppe ist offline   Mit Zitat antworten
Alt 11-01-2011, 09:33   #8 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
Hallo, ich nochmal

Ich wollte die Frage jetzt nochmal allgemeiner stellen, da wir irgendwie nicht weiterkommen.

Ihr habt da vielleicht Ideen, die uns weiterhelfen...vielleicht auch einfach gute Links? (google hat uns bis jetzt nicht wesentlich geholfen).

Wie würdet ihr denn ein Multiplayerspiel aufbauen, wo 2 Leute zusammen zocken können und vorher sich in einer Lobby auswählen?

Bedingungen sind flash-client, java-server und blazeDS.

Unsere Idee bis jetzt war, dass man auf eine seite geht, wo der Flash-client eingebunden ist. Der Flash-client öffnet direkt auch eine SOcketverbindung zum Java-server. In einer Lobby, bestehend aus Liste der Nutzer + Buttons zum verbinden/refresh, können sich die Spieler dann finden und der Server sollte dann die Socketverbindungen zusammenlegen...dann können die beiden spielen.

Ist das total doof? Gibts ne viel einfachere Möglichkeit?

Hilfe wäre echt großartig
Milchsuppe ist offline   Mit Zitat antworten
Alt 11-01-2011, 11:51   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.142
Naja, die Frage die sich mir stellt ist, was ihr mit dem Server macht. Ja, immer noch

Blaze unterstützt verschiedene Protokolle und Methoden um Daten zu transfereieren, der Servlett Container wird Session handling bieten...

Ein für mich natürlicherer Weg wäre ein P2P Application zu bauen via Cirrus. Das Backend würde dann entsprechend schlank ausfallen können... evtl ganz wegfallen.
Omega Psi ist offline   Mit Zitat antworten
Alt 11-01-2011, 12:21   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2011
Beiträge: 6
Mhm der Server sollte eigentlich schon ein paar Berechnungen machen (sind noch nicht implementiert)

Z.B. ob die Kugeln treffen und das Resultat (Lebenspunkte etc.) an beide Clienten schicken.

So haben wir uns das erstmal gedacht...

Hab mir Cirrus kurz überflogen: Socket-verbindung ist also garnicht nötig für echtzeit? Aber was ist der Vorteil? Dann müsste ja einer der Clienten quasi den "host" mimen und die oben genannten Sachen berechnen?
Milchsuppe ist offline   Mit Zitat antworten
Alt 12-01-2011, 14:31   #11 (permalink)
Neuer User
 
Registriert seit: Oct 2008
Beiträge: 148
hi,
schau dir mal den smartfoxserver an. der bietet schon sowas wie "räume" wo man sich anmelden kann....
sytch ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
AMF Netconnection vs. RemoteObject niggeulimann ActionScript 3 0 15-10-2010 15:29
[object AsyncToken] wie mit RemoteObject? lubbi Flex programmieren 10 22-05-2010 22:36
Validator mit RemoteObject Jarell Flex programmieren 3 03-03-2010 07:04
Flex 3 AMF / RemoteObject Verständnisfrage fred am rechner Flex programmieren 4 22-09-2008 12:26
Flex 3 aund Pfad zu RemoteObject Slashwalker Flex allgemein 1 03-05-2008 19:40


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele