Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.09.2015, 17:59

Multiplayer Web Game entwickeln

Guten Tag,

ich würde gerne
eine ein Multiplayer Web Game entwickeln bzw. habe schon bisschen damit
angefangen. Mit javax.websocket bin ich wie
folgt vorgegangen. Der Client sendet dem Server eine Nachricht,
dieser sendet dem Client eine Antwort und die Nachricht zurück.
Schön und gut, aber es sollen am ende mehre Clients mit dem Server
kommunizieren und auch gegen einander spielen könne z.b p1 vs p2 und
p5 vs p3. Dafür müsste es dem Server möglich sein, die einzelnen
Clients fest zu registrieren und bestenfalls Variablen zu zuweisen,
um unterschiedliche Clients über bestimmte Ereignisse zu informieren
und Sie mit anderen Spieler in Bezeichnung zu setzten. Über jeden
Tipp würde ich mich freuen.



Lg
Bro

Quellcode

1
2
3
4
5
6
7
<!DOCTYPE html><html><head>
  <title>test</title> </head> <body >  
<div> <input id="textMessage" type="text"> <input type="button" value="Send Message" onClick="sendMessage();">    <br>
    <textarea id="messagesTextarea" rows="10" cols="50"></textarea>
</div>  <script type="text/javascript"> var webSocket =  webSocket=new WebSocket("ws://localhost/Sim/serverendpointdemo");  var messagesTextarea = messagesTextarea=document.getElementById("messagesTextarea"); webSocket.onopen=function(message) {processOpen(message);}; webSocket.onmessage=function(message) {processMessage(message);}; webSocket.onclose=function(message) {processClose(message);}; webSocket.onerror=function(message) {processError(message);}; function processOpen(message) {            messagesTextarea.value +=" Server Connect.... "+"\n";        }
        function processMessage(message) {      messagesTextarea.value +="Server to Client ===> "+ message.data +"\n";} function sendMessage() {if (textMessage.value!="close") {                webSocket.send(textMessage.value); messagesTextarea.value +=" Send to Server ===> "+ textMessage.value +"\n"; textMessage.value="";            }else {                websocket.close();            }           } function nextQuestion() {  webSocket.send("nextQuestion"); messagesTextarea.value +=" Send to Server ===> nextQuestion \n"; textMessage.value="";        } function processClose(message) {            webSocket.send("Client disconnected......");  messagesTextarea.value +="Server Disconnected... "+"\n";        } function processError(message) {            messagesTextarea.value +=" Error.... \n";        }    </script>
    </body>



Quellcode

1
2
3
4
5
import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/serverendpointdemo")public class ServerEndpointDemo {
    @OnOpen public void handleOpen() {      System.out.println("Client is now connected...");   }   @OnMessage  public String handleMessage(String message) throws IOException {        String replyMessage = "Client to Server===> "+ message;     return replyMessage;    }
    @OnClose public void handeClose() {     System.out.println("Client is now disconnected.");  }
    @OnError    public void handleError(Throwable t) {      t.printStackTrace();    }}



Sorry
aber ich weiß nicht warum die Formatierung des Codes so
verstellt wird
?(



radon

Frischling

Beiträge: 8

Wohnort: Frankfurt > Dreieich

Beruf: Student

  • Private Nachricht senden

2

22.09.2015, 20:08

Client Identifizierung:

Um einen client persistent zu machen, musst du ihn an irgendwas wiedererkennen. Das kann entweder die IP sein, oder wie bei Webanwendungen üblich, eine sessionid, die serverseitig mit einem Sessiontoken assoziiert wird.
Das kann so ablaufen, dass sich der client über deine API "anmeldet" und einen eindeutigen Hash wert bekommt. Ab diesem Moment wird der client serverseitig nurnoch mit diesem hash identifiziert, der mit Zunahme seiner IP und vlt. diverser Browser-Metadaten wie User-Agent oder solches authentifiziert.

Für mich sieht das wie Java aus, da gibt es auch persistente Sockelverbindungen, wobei die einen Verbindungsabbruch überstehen sollten, vondaher denke ich kommst du um die session-id-lösung nicht rum.
Mit deiner Javascriptseitigen Sockellösung kenne ich mich nicht aus.

Die alleinige Wiedererkennung von clients anhand ihrer IP-Adresse (Die bekommst du aus den socket-metadaten) reicht nicht aus, weil auch der Fall abgedeckt sein muss, dass mehrere Clients hinter der selben IP spielen können sollen, z.b. aus einem Uni-Netzwerk heraus oder dergleichen.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

3

22.09.2015, 22:24

Er benutzt websockets, du sollte dies nicht sein Problem sein.. also zumindest nicht wenn er sie richtig einsetzt. Er muss sich nur die Verbindung merken/halten solange er sie braucht. Ehrlich gesagt verstehe ich seine Frage nicht, zumindest nicht genau wo das Problem liegt.
:love: := Go;

4

22.09.2015, 23:39

Er benutzt websockets, du sollte dies nicht sein Problem sein.. also zumindest nicht wenn er sie richtig einsetzt. Er muss sich nur die Verbindung merken/halten solange er sie braucht. Ehrlich gesagt verstehe ich seine Frage nicht, zumindest nicht genau wo das Problem liegt.
Danke für die schnellen Antworten.
Ehrlich gesagt war das meine Frage. Wie ist es Programmiertechnisch möglich, sich mehrere Verbindungen zu merken, halten und jederzeit beliebig über diese Verbindungen Kontakt zu den Clients auf zu nehmen? Momentan habe ich nur eine handleMessage Methode, deren return Wert automatisch an den aktuellen Client gesagt wird.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

22.09.2015, 23:53

Die Funktionen bekommen optional einen weiteren Parameter vom Typ Session. Damit kannst du zuordnen welche Kommunikation zusammengehört.

radon

Frischling

Beiträge: 8

Wohnort: Frankfurt > Dreieich

Beruf: Student

  • Private Nachricht senden

6

23.09.2015, 00:17

Er benutzt websockets, du sollte dies nicht sein Problem sein.. also zumindest nicht wenn er sie richtig einsetzt. Er muss sich nur die Verbindung merken/halten solange er sie braucht. Ehrlich gesagt verstehe ich seine Frage nicht, zumindest nicht genau wo das Problem liegt.
Danke für die schnellen Antworten.
Ehrlich gesagt war das meine Frage. Wie ist es Programmiertechnisch möglich, sich mehrere Verbindungen zu merken, halten und jederzeit beliebig über diese Verbindungen Kontakt zu den Clients auf zu nehmen? Momentan habe ich nur eine handleMessage Methode, deren return Wert automatisch an den aktuellen Client gesagt wird.


Naja entweder du gehst alle Verbindungen in einem Game Loop ständig durch, holst dir was in den sockets für Daten verfügbar sind und behandelst das dann für deine Spiellogik,
oder du packst jede aktive Verbindung in einen Thread, der permanent aus den Datenpackages sinnvolle Datensätze für deine Spiellogik übersetzt und dann an die entsprechenden Systeme weitergibt.

Das ist ja die Aufgabe deines Servers den du in Java schreibst.

https://docs.oracle.com/javase/tutorial/…ientServer.html
http://tutorials.jenkov.com/java-multith…ded-server.html

Sessiondata merkst und überträgst du dann auch nur, wenn die Socketverbindungen einen Verbindungsabbruch/Page reload überstehen soll. (Eine ordentliche authentifizierung vorher ist natürlich ohnehin vorausgesetzt)

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

7

23.09.2015, 00:27

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/serverendpointdemo") 
public class ServerEndpointDemo {
    @OnOpen public void handleOpen() {
        System.out.println("Client is now connected...");
    }@OnMessage public String handleMessage(String message) throws IOException {
        String replyMessage = "Client to Server===> " + message;
        return replyMessage;
    }@OnClose public void handeClose() {
        System.out.println("Client is now disconnected.");
    }@OnError public void handleError(Throwable t) {
        t.printStackTrace();
    }
}


Du hast bereits alles was du brauchst, du solltest dir nur einmal die Synopsis von OnMessage ansehen. Dort gibt es einen Session Parameter. Jede Verbindung sollter eine eigene bekommen. Wenn du sie nicht mehr brauchst schließt du sie. Wie du das auf Anwendungsebene verarbeitest bleibt bei dir (z.B. Login usw.). Wie das weiter ausschaut kann ich dir im Bezug auf Java nicht sagen da ich von Java nicht den Hauch einer Ahnung habe.

Danke an ;) codebeautify.org
:love: := Go;

8

23.09.2015, 00:28

Die Funktionen bekommen optional einen weiteren Parameter vom Typ Session. Damit kannst du zuordnen welche Kommunikation zusammengehört.
Ja, aber ich habe nur einen return Wert und kann so nur dem aktuellen Client antworten. Also gibt es eine Möglichkeit mehrere Clients über ein Ereignis zu informieren? Kann der Server nur antworten, wenn er eine Anfrage bekomm?
Gibt's eine Dokumentation für javax.Socket? Am besten auf deutsch mit Beispielen. Ty

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

9

23.09.2015, 00:34

Evtl hilft das:

Java ist auch eine Insel
Java ist auch eine Insel C21 (keine websockets)


Edit: Hab noch diesen Link gefunden (jedoch english).
websocket-chat-clients-in-java
:love: := Go;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »H5::« (23.09.2015, 00:49)


radon

Frischling

Beiträge: 8

Wohnort: Frankfurt > Dreieich

Beruf: Student

  • Private Nachricht senden

10

23.09.2015, 00:59

Die Funktionen bekommen optional einen weiteren Parameter vom Typ Session. Damit kannst du zuordnen welche Kommunikation zusammengehört.
Ja, aber ich habe nur einen return Wert und kann so nur dem aktuellen Client antworten. Also gibt es eine Möglichkeit mehrere Clients über ein Ereignis zu informieren? Kann der Server nur antworten, wenn er eine Anfrage bekomm?
Gibt's eine Dokumentation für javax.Socket? Am besten auf deutsch mit Beispielen. Ty


Du nutzt so ein komisches server zeug mit dem ich mich überhaupt nicht auskenne, das hier gibt aber schon genug Informationen her um damit genau das tun zu können was du willst. Sogar user authentication ist dabei (Principal)
https://docs.oracle.com/javaee/7/api/jav…et/Session.html

Deine @OnOpen funktion braucht die parameter, mindestens für session, etwa sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ConnectionHandler {

    private LinkedList< Session > clients;

    public ConnectionHandler() {
        clients = new LinkedList<Session>();
    }

    /**
     * Für Infos zur Session klasse siehe
     * @link https://docs.oracle.com/javaee/7/api/javax/websocket/Session.html
     */
    @OnOpen public void handleOpen(Session session, EndpointConfig config) {
        
        System.out.println("New client detected with unique id "+session.getId());
        // Füge zu den clients hinzu
        clients.AddLast(session);

    }


Die @OnMessage funktion ist für deine Zwecke auch nutzlos, weil du auf diesen Weg nur auf String Messages vom client hörst, ohne eine Möglichkeit zu unterscheiden von wem sie kommen (vermute ich!)
Daher ist das für dich nützlich: https://docs.oracle.com/javaee/7/api/jav…MessageHandler-
Registriere mit dem Client in der @OnOpen Methode gleich einen MessageHandler, schön gekapselt in einem Objekt, dann hast du die Sessioninfos der Verbindung sowie den MessageHandler beisammen und weißt immer was zusammengehört.

Dokumentation auf Deutsch: Nicht dass ich wüsste.

Werbeanzeige