Netzwerkspiel - wie umsetzen ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Würde gerne mein "super" Würfelspiel mit meiner Freundin im Netzwerk bzw. über Internet spielen !

http://www.ubuntuusers.de/paste/12253/

Was sollte ich mir so alles anschauen ?

gruss frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Was sollte ich mir so alles anschauen ?
Hallo Frank!

Du könntest z.B. mit XMLRPC http://www.python-forum.de/topic-5478.html arbeiten. Das erste Programm wird automatisch zum Server. Clients melden sich am Server an und übergeben die eigene Adresse dem Server. Dieser verbindet sich dann mit den Clients. Das funktioniert nicht schlecht. Ich habe dieses System bei meinem Bankomat-Programm im Einsatz. So können mehrere Computer auf ein Bankomat-Terminal zugreifen.

Code: Alles auswählen

CLIENT  ---->  SERVER
CLIENT  <----  SERVER
Allerdings sollte man sich bei dieser Lösung schon mit Threading auskennen, da hier ohne Threads nichts läuft.

Dann gibt es noch Pyro http://pyro.sourceforge.net/. Damit kann man auf einfache Weise ein komplettes Netzwerk von Python-Programmen aufbauen. Pyro hat auch einen Event-Server http://pyro.sourceforge.net/manual/6-eventserver.html mit an Board. Damit kann man Events an angeschlossene Clients übermitteln.

Natürlich gibt es noch mehr Möglichkeiten. Aber diese beiden scheinen mir recht praktisch zu sein. Die Erste, weil ich sie schon eine Weile im praktischen Einsatz habe und die andere, weil sie mit Events arbeitet und einem dadurch viel Programmierarbeit erspart wird.

Dann gibt es noch "asynchat" http://docs.python.org/lib/module-asynchat.html. Damit lassen sich auch recht einfach Programme bauen, die sich übers Netz miteinander unterhalten können.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 29. Juni 2007, 23:04, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wenn es eine Client-Server-Architektur werden soll, kannst du unten von Sockets bis auf oben mit höheren Protokollen in einer breiten Masse wählen. Durch Verwendung von bswp. HTTP, XML-RPC oder SOAP hast du bereits fertige Implementierungen, die du direkt benutzen kannst; bei Sockets oder den asyn*-Modulen ist noch etwas mehr Handarbeit gefragt.

Peer-to-Peer ist auch denkbar, aber vielleicht für ein Spiel nicht so ideal *an damalige Zeiten mit IPX und "Waiting for player 6 to join..." denk*.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke an Gerold und YOGI !

Ich verstehe mal gar nix davon - macht ja nix - bekomme hier ja immer kompetente Hilfe. Ich habe ein Router SGB 900 von Motorola. Dieser regelt über DHCP mein internens Netzwerk (hoffe die Aussage stimmt mal so). Dieser müsste ja irgendwie die IP-Adresse von dem Rechner meiner Freundin an mich (evt. dann Server) übertragen ?! - oder geht das gar nicht ?

gruss und dank frank
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Wenn ihr im Lan seit kannst du sie per UDP Broadcast finden (*gerold angrins*). Falls du da ein Beispiel brauchst kann ich das liefern. Um übers Internet zu spielen verwendet man normalerweise Master Server welche vermitteln. Die haben dann fixe IP's oder zumindest Hostnamen. Grundsätzlich kann so ein Master Server auch ein einfaches Script auf einem Webserver sein (CGI, WSGI, ...).

PS: Ist die Sache mit dem Master Server nicht Patentiert? *g*
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Na - ich verstehe immer noch nix! Was ist der erste Schritt - richte auf deinem PC das oder das ein - oder so ? Erklärt es für einen Dummy !

gruss und dank frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Ich habe ein Router SGB 900 von Motorola.
Hallo Frank!

Wenn du kein Programm auf einem Server laufen lassen kannst, auf den du und deine Freundin Zugriff haben, dann musst du dein Netz und das deiner Freundin so einrichten, dass die Computer miteinander kommunizieren können.

Das ist mir jetzt zu viel, um das hier genauer zu erklären. Aber Grundsätzlich sollte es möglich sein, mit deinem Router Port-Forwarding einzurichten. Wie das bei deiner Freundin aussieht? Keine Ahnung.

Diese Anleitung ist zwar für eMule gedacht, aber sie zeigt schon mal auf, dass es funktionieren könnte.
http://portforward.com/english/routers/ ... /eMule.htm

Falls sich in beiden lokalen Netzen ein Router um die Internetverbindung kümmert, müssen beide Router so eingerichtet werden, dass, wenn eine Verbindung zur externen IP-Adresse des Routers zu einem bestimmten Port aufgebaut wird, diese Verbindung an die gewünschten Computer weitergeleitet wird.

Mein Tipp: Lass das von einem Freund oder einer Freundin einrichten, die sich damit auskennt. :roll: Oder informiere dich über TCP/IP, Port-Forwarding und DHCP. Das Verbinden von zwei Computern kann sehr einfach oder in vielen Fällen auch sehr Komplex sein. Das hängt von der Situation ab.

Vielleicht findest du irgendwo im Internet noch eine Anleitung dafür.
kaytec hat geschrieben:UDP Broadcast finden (*gerold angrins*)
@veers: Wir haben hier im Board das "Codesnippets"-Forum. Da würde dein Beispiel ziemlich gut rein passen und vielen helfen, die nach so etwas suchen. -- Ich fände es echt super von dir, wenn du es dort rein stellen würdest. 8)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Gerold !

Ok - ein wenig Ahnung habe ich schon, da ich das SGB Router selbst eingerichtet habe und auch mal die interne Firewall in Betrieb hatte. Da jeder in meinem Haus über mein Modem surft (geht auch nur in einem Altbau, da gibt es kein Stahlbeton) habe ich die aber wieder abgestellt , denn alle wollten irgendeinen Port freigeschaltet haben und ich war nur am rumbasteln. Meine Freundin surft auch über das Modem - wir haben also die gleiche externe IP-Adresse. Nur hinter dem Router ist diese über DHCP in Interne aufgeteilt. Ich müsste ein internes Netzwerk einrichten und einen Rechner zum Server machen ? Dieser Rechner übernimmt dann die Funktion des DHCP-Servers. Ein internes Netzwerk im internen Netzwerk ? - hört sich krank an !

Werde mal rumprobieren und mich wieder melden !

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hy Gerold !

Habe mir das mit XMLRPC mal angeschaut und beide Scripte laufen lassen. Geht auch soweit, doch beim Serverscript stürzt leider die IDLE ab. Der localhost 50505 ist weiterhin vorhanden und so kommt der client auch an die Zufallszahlen. Für weitere Versuche starte ich immer einen neuen localhost(z.b: 50504). Ist natürlich nicht die beste Lösung. Könnte es an der mitgelieferten IDLE von Python liegen ?

gruss frank
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Versuch's doch einfach mal über die Kommandozeile und ohne IDLE :)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Über die Konsole habe ich es versucht - kann es auch ohne Probleme starten, doch ich bekomme diese Fehlermeldung, wenn ich den client starte?

Traceback (most recent call last):
File "/home/kaytec/test_client.py", line 12, in <module>
print server.get_random_int(1, 6)
File "xmlrpclib.py", line 1147, in __call__
return self.__send(self.__name, args)
File "xmlrpclib.py", line 1437, in __request
verbose=self.__verbose
File "xmlrpclib.py", line 1191, in request
headers
ProtocolError: <ProtocolError for localhost:50504/RPC2: -1 >

gruss frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Geht auch soweit, doch beim Serverscript stürzt leider die IDLE ab.
Hallo Frank!

Das Programm im Idle läuft zwar weiter, aber Idle bekommt keine Chance mehr Luft zu holen um sich mal wieder neu zu zeichnen. Das ist eine der Eigenarten von Idle. Nimm was anderes.

Code: Alles auswählen

Traceback (most recent call last):
File "/home/kaytec/test_client.py", line 12, in <module>
print server.get_random_int(1, 6)
File "xmlrpclib.py", line 1147, in __call__
return self.__send(self.__name, args)
File "xmlrpclib.py", line 1437, in __request
verbose=self.__verbose
File "xmlrpclib.py", line 1191, in request
headers
ProtocolError: <ProtocolError for localhost:50504/RPC2: -1 >
Ich habe eben den Server und den Client unter Windows XP mit Python 2.4.4 und unter Ubuntu mit Python 2.4.4 getestet. Beides funktioniert bei mir einwandfrei. Nimmst du wirklich die Skripte von http://www.python-forum.de/topic-5478.html ?
Starte lieber mal den Computer neu. Vielleicht hängt da noch etwas auf dem TCP-Port.

Pyro ist aber auch nicht ohne. Das solltest du auch noch ausprobieren.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

gerold hat geschrieben:@veers: Wir haben hier im Board das "Codesnippets"-Forum. Da würde dein Beispiel ziemlich gut rein passen und vielen helfen, die nach so etwas suchen. -- Ich fände es echt super von dir, wenn du es dort rein stellen würdest. 8)
http://www.python-forum.de/viewtopic.php?p=72089#72089 ;)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Gerold !!

Ich verwende Ubuntu 7.04, Feisty Fawn. Ich habe den code nochmal von deinem Link kopiert und die Fehlermeldung ist die gleiche. In der Konsole bekomme ich auch ein Fehlermeldung, wenn ich den client starte.
  • Exception happened during processing of request from ('127.0.0.1', 48933)
    Traceback (most recent call last):
    File "SocketServer.py", line 222, in handle_request
    self.process_request(request, client_address)
    File "SocketServer.py", line 241, in process_request
    self.finish_request(request, client_address)
    File "SocketServer.py", line 254, in finish_request
    self.RequestHandlerClass(request, client_address, self)
    File "SocketServer.py", line 522, in __init__
    self.handle()
    File "BaseHTTPServer.py", line 316, in handle
    self.handle_one_request()
    File "BaseHTTPServer.py", line 310, in handle_one_request
    method()
    File "SimpleXMLRPCServer.py", line 477, in do_POST
    self.send_response(200)
    File "BaseHTTPServer.py", line 360, in send_response
    self.log_request(code)
    File "SimpleXMLRPCServer.py", line 503, in log_request
    BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size)
    File "BaseHTTPServer.py", line 397, in log_request
    self.requestline, str(code), str(size))
    File "BaseHTTPServer.py", line 432, in log_message
    self.log_date_time_string(),
    File "BaseHTTPServer.py", line 452, in log_date_time_string
    now = time.time()
    AttributeError: 'module' object has no attribute 'time'
gruss und dank frank
BlackJack

Kann es sein, dass Du da irgendwo eine `time.py` rumliegen hast, die anstelle des `time`-Moduls aus der Standardbibliothek geladen wird?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Black Jack!

ja genau - das war das Problem. Die IDLE wird aber auch ohne time.py abgeschossen. Mit Dr. Python geht es jetzt. Dieses blöde time.py hat mir auch Dr. Python zum Problem gemacht. Genau dieses Problem gabe es hier schon im Forum - habe es auch gelesen aber keinen Bezug zu meinem gesehen :oops:.

Entschuldigung an alle, weil ich eure Zeit mit meiner Blödheit verschwendet habt.:oops:

gruss und dank frank
Antworten