Guten Tag,
ich weis dies wird sehr oft gefragt und die Antworten sind meistens vorhersehbar doch ich wage es einmal dennoch zu fragen.
Ich habe mich in den letzten zwei Tagen sehr viel mit der Fragestellung beschäftigt wie ich ein Multiplayer Projekt mit dem RPG-Maker XP / VX erarbeiten kann.
Ich stieß auf lediglich ein einziges vielversprechendes Ergebniss im Internet: http://nrpgxpfiles.webs.com/
Zusammenfassend gesagt sei, dass hier ein kompletter Client für ein Massive-Multiplayer-Online-RPG mit dem RPG-Maker XP erstellt wird; der Server hingegen wird extern betrieben. Verständlicherweise.
Allerdings will ich kein MMORPG erstellen, gott bewahre, so utopisch sind meine Fantasien nicht.
Aber ich würde gerne ein kleines einfaches RTS-Spiel von mir für zwei Spieler umkonzipieren. Es handelt sich dabei um nichts allzu aufwändiges, Performance und Datenübertragungsmengen sollten keine nennenswerte Rolle spielen.
Was ich nun brauche ist keine genaue Anleitung wie soetwas aufgebaut wird, das schaffe ich wahrscheinlich. Ich brauche nur die nötigen Klassen, sprich die Schnittstellen zu den WindowsAPI's um eine Verbindung zwischen zwei Computern herzustellen.
Unter den oben verlinkten Scripten für den Client ließen sich folgende Zeilen extrahieren:
Unschwer zu erkennen sind dies die benötigten Klassen um einen TCP-Client zu starten und diesen mit einem Server zu verbinden. Eine Hälfte wäre also gefunden.
Allerdings finde ich keine vergleichbaren Scripte für einen Server. Ich habe tatsächlich Stunden damit verbracht und verschiedene Ansätze verfolgt wie ich zwei Computer nur über den RPG-Maker verbinden kann ohne einen externen Server zu verwenden. Ohne Erfolg versteht sich, sonst würde ich nun nicht hier um Hilfe bitten.
Ich weis nicht in welcher Schwierigkeitsstufe sich diese Bitte bewegt, ich sehe, die Klassen für die Clientverbindung lassen sich in überschaubarem geringen Aufwand erstellen, ich weis auch, dass soetwas mit dem RPG-Maker 2000 (DestinyPatch) möglich ist.
Falls mir also irgendjemand bei diesem Problem helfen kann, sprich eine Schnittstelle zwischen den nötigen WindowsAPI's und dem Ruby Interpreter des Makers bereitstellen so wäre ich sehr sehr dankbar.
Selbstverständlich würde ein Creditseintrag bei jedem Spiel welches die Scripte verwendet gesichert sein und ich würde die Scripte auch bereitwillig jedem Interessenten zur Verfügung stellen so wie sie mir gegeben worden sind.
Allerdings finde ich keine vergleichbaren Scripte für einen Server. Ich habe tatsächlich Stunden damit verbracht und verschiedene Ansätze verfolgt wie ich zwei Computer nur über den RPG-Maker verbinden kann ohne einen externen Server zu verwenden. Ohne Erfolg versteht sich, sonst würde ich nun nicht hier um Hilfe bitten.
...
Du brauchst keine "vergleichbaren" Skripte weil in den obigen so wie es aussieht schon alles drin ist.
Die Unterscheidung Server/Client ist primär eine inhaltliche, sprich welcher Teil übernimmt welche Aufgaben (Server bietet Dienst an, Client nimmt Dienst in Anspruch), weniger eine technische. Wenn du eine Client-Client Verbindung haben willst, implementierst du in aller Regel Client und Server in einem. Meistens läuft das so, einer der beiden Spieler "eröffnet" das Spiel und fungiert damit als Server, der andere verbindet sich dann zu dessen IP und fungiert als reiner Client.
Die Socket-Klasse ist so gesehen "alles" was du brauchst. Ein Socket ist eine Schnittstelle zwischen Netzwerk und Programm. Du kannst dich über einen Socket mit einem Server verbinden, genauso kannst du mithilfe eines Sockets aber auch auf einkommende Verbindungen warten (listen - horchen) und diese annehmen (accept).
Für beides scheint es in der obigen Klasse Funktionen zu geben, somit hast du eigentlich alles was du brauchst.
Du musst also so vorgehen:
1. Spieler A eröffnet das Spiel
-> A erstellt einen Socket und horcht auf einem fest definiertem Port auf Verbindungen
2. Spieler B verbindet sich zur IP-Adresse von A
-> Socket erstellen und eine Verbindung zu A als Server aufbauen (IP-Addr. von A, und der vorher definierte Port auf dem A horcht)
3. Das Programm von A nimmt mittels accept die Verbindung an.
4. Ab jetzt können beide über diese Sockets Daten versenden und empfangen
Da die Skripte oben aber wohl nur eine sehr rohe Anbindung an die WinSock-DLL von Windows bieten, keine benutzerfreundliche Netzwerkbibliothek, lohnt es sich aber vermutlich ein wenig generell über Netzwerkprogrammierung mit Sockets schlau zu machen.
Vielen Dank für die Antwort.
Ich habe bereits Netzwerkspiele programmiert, nur war dies damals mit Java wo ich getrennte Klassen für Server und Clientverbindung zur Verfügung hatte. Ich wusste nicht direkt wie groß der Unterschied zwischen beiden ausfallen würde. Ich habe mir das Programmieren bisher größtenteils selbst beigebracht indem ich das Internet durchstöberte und immer wieder verschiedenes ausprobiert habe.
Wie genau habe ich den Server Socket zu initialisieren? Immerhin scheinen alle Methoden eine Host angabe zu benötigen, der Server sollte lediglich eine Port angaben brauchen nehme ich an.
Könntest du mit diesen Klassen ein kurzes Beispiel dafür geben? Das wäre sehr freundlich von dir, ich lerne immer sehr gerne an Beispielen.
Ich selbst kenn mich kaum aus mit der Ruby-Klasse oben, oder der Windows-Socket Library.
Vielleicht hilft dir das hier weiter: Getting started with Winsock
Die Funktionen des Winsocks-Moduls scheinen ja 1-1 die Windows-Funktion aufzurufen, entsprechend solltest du wohl hoffentlich damit klar kommen.
Allerdings kann der Clientsocket derzeit noch keine Verbindung zum Serversockt herstellen, es könnte an meiner Firewall oder dem Router liegen, oder an dem Code. Ersteres kann ich überprüfen, letzteres werde ich alleine wahrscheinlich nicht herausfinden können.
Kann mir jemand hierbei helfen?
Mit einem funktionierenden Rubybeispiel direkt kann ich dir nicht behilflich sein.
Allerdings kenne ich Client-Server Anwendungen eher so das es auch wirklich beides gibt.
Einen Client und einen Server.
Wenn ich deinen Code richtig lese, versuchst du erstmal einen einen Socket auf Port 5 aufzumachen.
Das ist schonmal nicht möglich, da die Ports von 0 - 1023 (well known Ports) reserviert sind.
Du kannst also einen Port ab 1024 nutzen.
Die nächste Sache ist halt wie am Anfang erwähnt das du den Server auf den Port horchen lässt und danach direkt im
Serverprogramm den Client initalisiert. An sich müsste es aber so laufen das der Server auf den Sockel horcht und dann
in einer Dauerschleife auf einen Verbindungsversuch wartet. Wenn man nun noch die Anfragen mehrerer Clients bearbeiten will,
müsste man für jede eingehende Verbindung einen Thread öffnen. Für einen einfachen Versuch würde aber erstmal reichen einen eingehenden
Verbindungsversuch anzunehmen.
Als zweites brauchst du dann das Clientprogramm welches sich versucht mit dem Serversocket zu verbinden. Das sollte allerdings ebenfalls ein
externes Programm sein.
@makenshi: Der Port welchen ich verwenden will ist 9999, die 5 als Parameter der .listen Methode gibt, soweit ich verstanden habe, die maximale Anzahl an Verbindungen an welche der Server aufnimmt.
Nur als Information zum oben beschriebenen, der Server wird initialisiert, der Client auch, der Fehler welchen ich erhalte liegt in der Zeile: "$c.connect($aic)", alle vorhergehenden scheinen für den Computer in Ordnung zu sein.