# wie schnell kann java netzwerk sein?



## ollilebowski (8. Sep 2005)

hallo! 

ich will in java ein netzwerkspiel programmieren. 
als frame und über normales lan netzwerk zuhause. 

ich habe zwar server und client und ein netzwerkspiel programmeirt und schon optimiert, 
aber in den programmen greife ich auf klassen von jemand anderem zu, 
die ich nicht verstehe.  ???:L 
desshalb wollte ich hier mal fragen, ob es vieleicht noch schneller geht. 

in meinem programm lasse ich in jedem spielschritt (frame) 
alle spielerclients ihre daten an einen hostclient senden. 
dieser fasst sie zusammen und sendet die zusammenfassung wiederum raus. 
alle spielerclients lesen die zusammenfassung, 
berechnen einen schritt und das ganze geht von vorne los. 

so bekomme ich etwa 10 frames pro sekunde. 
das nenne ich mal eine "ping" von 100ms.
könnte das deutlich schneller gehen? 
wie schnell sind eure netzwerk programme?

ich hab gelesen, 
dass java eigentlich nicht für netzwerk geeignet sei, 
weil es ja plattformunabhängig sein soll.

mfg, olli


----------



## byte (8. Sep 2005)

ollilebowski hat gesagt.:
			
		

> ich hab gelesen,
> dass java eigentlich nicht für netzwerk geeignet sei,
> weil es ja plattformunabhängig sein soll.



das halte ich mal für ein gerücht, denn die gängigen netzwerkprotokolle sind genauso plattformunabhängig.


----------



## EagleEye (8. Sep 2005)

äh hab ich das richtig verstanden
du schickst die Frames übers Netzwerk?

und das mit dem Netzwerk kann sich bestimmt nur wieder irgen ein C++ Typ ausgedacht haben


----------



## Nick H. (9. Sep 2005)

mal abgesehen davon ist es viel einfacher ein Netzwerk mit Java als mit c++ zu machen
das würde keier von "denen" erwähnen

aber deine Methode hört sich irgendwie komisch an
hab sowas aber noch nie gemacht...


----------



## Mag1c (9. Sep 2005)

Hi,

wie genau funktioniert den die Kommunikation zwischen Client und Server ? Ich vermute mal,
daß du kaum bzw. gar keine Parallelisierung implementiert hast (Threads?) und damit die Clients
extrem ausgebremst werden. (Nur mal so ins Blaue getippt)

Gruß
Mag1c


----------



## ollilebowski (9. Sep 2005)

also wie gesagt, ich verstehe nur das nötigste, von java hab ich kaum ahnung. 
um beim host server und client zu starten, 
benutze ich einfach eine funktion die ich mir in mein programm kopert hab. 


```
void serverundclient(){
	if(!server){
		if(serverstarter==null){
			serverstarter=new ServerStarter(this);
		}
		serverstarter.setVisible(true);
		server=true;
	}
	if(!client){
		client=true;
		if(comm==null){
			clientstarter=new ClientStarter(this);
			clientstarter.setVisible(true);
			if(!clientstarter.isCanceled()){
				comm=clientstarter.getCommunicator();
				comm.addNetListener(this);
			}
		}
		client=true;
	}
}
```

um etwas zu senden benutze ich auch eine kopierte funktion


```
public void send(byte[] data,byte arraystellen){
	data[0]=(byte)(spielerNr);
	comm.sendCommand(arraystellen,data);
}
```
(das array, das damit gesendet wird kann jeder client lesen)

und zum empfangen so etwas wie mouselistener für netzwerk


```
public void netEventReceived(NetEvent e){
	byte cwer=e.getData(1);
	byte c2=e.getData(2);
	byte c3=e.getData(3);
	byte[] datatosendhier=new byte[4+spielerAnz];
	if(initialize){
		if(c2==c2WERBINICH && cwer==0){
			spielerAnz++;
			datatosendhier[2]=c2DUBIST;
			datatosendhier[3]=(byte)spielerAnz;
			send(datatosendhier,(byte)(4+spielerAnz));
		}
	}
}
```

wenn das spiel läuft 
funktioniert das kurz formuleirt so: 

host: 
void neteventreceived(){
    wenn etwas empfangen wird, 
    dann prüfe von welchenm spieler es kommt. 
    wenn von dem spieler noch keine aktuellen daten vorliegen, 
    dann füge es der aktuellen "datensammlung" zu. 
    wenn aktuelle daten von allen spielern vorliegen, 
    dann schicke die "datensammlung ins netz
}

spieler: 
void update(){
    schicke eigene aktuelle daten ans netz. 
    wenn aktuele "datensammlung" empfangen wurde, 
    dann berechne einen schritt im spiel 
    und aktuallisiere die eigenen daten.
}

(die daten sind nur was für tasten ein spieler gedrückt hat, 
und wo die maus ist und ob eine maustaste gedrückt ist)

es bewegt sich also immer erst etwas, nachdem die "datensammlung" erhalten wurde. 
so werden alle spieler druch den host synchronisiert.

wenn ihr schnellere lösungen habt, 
postet diese bitte


----------



## Limit (5. Okt 2005)

Zufälligerweise habe (musste) ich vor kurzem genau ein solches Programm schreiben. Ohne Threads wirst du wohl nicht wirklich auf einen grünen Zweig kommen, was die Geschwindigkeit angeht, denn so schickt der Server die Daten erst an einen Client, wartet bis sie angekommen sind und schickt sie erst dann an den nächsten. 
Du solltest also für jeden einzelnen Client ein Thread aufmachen, der die Kommunikation zu eben jenem Client verwaltet.
Nebenläufige Programmierung ist ein Kapitel für sich, das solltest du in einem Buch oder Tutorial nachlesen und ggf. hier nochmal fragen.


----------



## ollilebowski (6. Okt 2005)

ich glaube, die clienten werden bei mir nicht nacheinander angesprochen. 
und wenn doch, macht das nicht viel aus. 
wenn ich nämlich mit 8 spielern spiele läuft es nicht merklich langsamer als zu zweit... 
- allerdings habe ich das bis jetzt nur auf einem einzigen computer probiert statt auf mehreren, d.h. ich habe ein netzwerk nur 'simuliert'. 
wenn ich es mal mit mehreren computern probiere und es läuft sehr langsam, 
werde ich mich an deinen eintrag erinnern.


----------

