Heim  >  Artikel  >  Java  >  Wie implementiert Java Websocket Online-Gaming-Funktionen?

Wie implementiert Java Websocket Online-Gaming-Funktionen?

王林
王林Original
2023-12-02 14:44:381580Durchsuche

Java Websocket如何实现在线游戏功能?

Java Websocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation über eine dauerhafte Verbindung erreichen kann. Dadurch eignet sich Java Websocket sehr gut für die Entwicklung von Echtzeit-Onlinespielen, da Spiele eine schnelle Interaktion und Echtzeitkommunikation erfordern.

In diesem Artikel stellen wir vor, wie Sie Java Websocket zur Implementierung von Online-Gaming-Funktionen verwenden. Wir werden Java 8 und Tomcat 8 als Entwicklungsumgebung verwenden und die Front-End-Seite verwendet HTML5 und JavaScript.

  1. Herstellen einer WebSocket-Verbindung

Zuerst müssen wir eine WebSocket-Verbindung erstellen. Wir können diese Funktionalität erreichen, indem wir einen WebSocket-Endpunkt schreiben. In einer JavaWeb-Anwendung können wir den Websocket-Endpunkt mit javax.websocket.Endpoint konfigurieren.

Das Folgende ist die Implementierung des Websocket-Endpunkts:

@ServerEndpoint("/game")
public class GameEndpoint {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket Opened: " + session.getId());
        GameSessionManager.getInstance().addSession(session); // 将Session加入管理器
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("WebSocket Message received: " + message);
        GameSessionManager.getInstance().handleMessage(message, session); // 处理消息
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("WebSocket Closed: " + session.getId());
        GameSessionManager.getInstance().removeSession(session); // 将Session从管理器中移除
    }

    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }
}

In diesem Endpunkt definieren wir vier Annotationen:

  • @ServerEndpoint("/game") definiert den Pfad dieses Endpunkts als "/game".
  • @OnOpen definiert, was dieser Endpunkt tut, wenn WebSocket geöffnet wird, z. B. das Hinzufügen einer WebSocket-Verbindung zum Manager.
  • @OnMessage definiert, was dieser Endpunkt tut, wenn WebSocket eine Nachricht empfängt, z. B. das Senden der Nachricht an alle verbundenen WebSocket-Clients.
  • @OnClose definiert, was dieser Endpunkt tut, wenn WebSocket geschlossen wird, z. B. das Entfernen der WebSocket-Verbindung vom Manager.
  • @OnError definiert, was dieser Endpunkt tut, wenn ein WebSocket-Fehler auftritt.

Hinweis: Dies ist nur ein einfaches Beispiel. In tatsächlichen Anwendungen sollten mehr Fehlerbehandlung und Sicherheitsprüfungen durchgeführt werden.

  1. Spielsitzungen verwalten

Wir müssen eine GameSessionManager-Klasse erstellen, um Spielsitzungen zu verwalten. GameSessionManager ist eine Singleton-Klasse, die zur Verwaltung aller WebSocket-Verbindungen und zur Verarbeitung spielbezogener Nachrichten verwendet wird.

Das Folgende ist die Implementierung von GameSessionManager:

public class GameSessionManager {

    private Set<Session> sessions = new HashSet<>();
    private static GameSessionManager instance;

    private GameSessionManager() {
    }

    public static GameSessionManager getInstance() {
        if (instance == null) {
            synchronized (GameSessionManager.class) {
                if (instance == null) {
                    instance = new GameSessionManager();
                }
            }
        }
        return instance;
    }

    public void addSession(Session session) {
        sessions.add(session);
    }

    public void removeSession(Session session) {
        sessions.remove(session);
    }

    public void handleMessage(String message, Session session) {
        // TODO 处理消息
    }

    public void broadcast(String message) {
        for (Session session : sessions) {
            send(message, session);
        }
    }

    public void send(String message, Session session) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

In dieser Klasse erstellen wir eine Sammlung von Sitzungen, um alle WebSocket-Sitzungen zu speichern. Verwenden Sie die Methode getInstance(), um das Singleton-Objekt von GameSessionManager abzurufen. Beim Hinzufügen und Entfernen von WebSocket-Verbindungen fügen wir einfach die Verbindung zur Sammlung hinzu oder entfernen sie. Beim Senden einer Nachricht durchlaufen wir alle WebSocket-Sitzungen und senden die Nachricht an jede einzelne. Beim Senden einer Nachricht verwenden wir die Methode session.getBasicRemote(), um den grundlegenden Remote-Port abzurufen, und rufen dann die Methode sendText() auf, um die Nachricht an den Client zu senden.

  1. Verarbeitung von Spielnachrichten

Wir werden die Spielnachrichten vom Client in der GameSessionManager-Klasse verarbeiten und sie an den Client zurücksenden. Wir beschäftigen uns hier auch mit der Spiellogik.

Hier ist ein einfaches „Chat“-Spiel mit „Hallo“- und „Tschüss“-Operationen als Beispiel:

public void handleMessage(String message, Session session) {
    JSONObject json = new JSONObject(message);
    String action = json.getString("action");
    switch (action) {
        case "hello":
            String name = json.optString("name");
            broadcast(name + " joined the game.");
            break;
        case "bye":
            String playerName = json.optString("name");
            broadcast(playerName + " left the game.");
            break;
        default:
            System.out.println("Unknown action: " + action);
            break;
    }
}

In dieser Implementierung analysieren wir zunächst die empfangene Nachricht in das JSON-Format. Anschließend überprüfen wir das Feld „Aktion“ der Nachricht und führen basierend auf den verschiedenen Vorgängen die entsprechende Aktion aus. Wenn die Aktion „Hallo“ lautet, erhalten wir den Namen des Spielers aus der Nachricht und verwenden die Broadcast-Methode, um die Willkommensnachricht an alle Spieler zu senden. Wenn die Operation „bye“ lautet, erhalten wir auch den Namen des Spielers aus der Nachricht und verwenden die Broadcast-Methode, um die Abschiedsnachricht an alle Spieler zu senden. Andernfalls geben wir eine Meldung für einen unbekannten Vorgang aus.

  1. Erstellen Sie eine Frontend-Seite

Die Frontend-Seite wird mit HTML5 und JavaScript implementiert. Wir müssen eine JavaScript-Klasse schreiben, die WebSocket implementiert. In einer JavaWeb-Anwendung können wir das WebSocket-Objekt von JavaScript verwenden, um eine WebSocket-Verbindung zu erstellen.

Das Folgende ist die JavaScript-Klasse, die WebSocket implementiert:

var webSocket = null;
var url = "ws://" + window.location.hostname + ":" + window.location.port + "/game";

function connectWebSocket() {
    if("WebSocket" in window) {
        webSocket = new WebSocket(url);

        webSocket.onopen = function(event) {
            console.log("WebSocket opened.");
        };

        webSocket.onmessage = function(event) {
            console.log("WebSocket message received: " + event.data);
            handleMessage(event.data);
        };

        webSocket.onclose = function(event) {
            console.log("WebSocket closed.");
        };
    } else {
        console.log("WebSocket is not supported by this browser.");
    }
}

function sendMessage(message) {
    if(webSocket) {
        webSocket.send(message);
    } else {
        console.log("WebSocket is not connected.");
    }
}

In dieser Implementierung prüfen wir zunächst, ob WebSocket unterstützt wird. Wenn ja, erstellen wir ein WebSocket-Objekt mit dem Konstruktor von WebSocket und weisen es der Variablen webSocket zu. Wir haben drei WebSocket-Ereignishandler definiert:

  • websocket.onopen Die Vorgänge, die beim Öffnen des WebSocket ausgeführt werden, z. B. das Initiieren einer Verbindungsanforderung an den Server.
  • websocket.onmessage definiert die Vorgänge, die WebSocket beim Empfang einer Nachricht ausführt, z. B. den Aufruf der Funktion handleMessage zum Verarbeiten der Nachricht.
  • websocket.onclose definiert, was zu tun ist, wenn WebSocket geschlossen wird, z. B. der Versuch, die Verbindung wiederherzustellen.

Wir definieren außerdem eine sendMessage-Funktion, die die Sendemethode des WebSocket-Objekts verwendet, um die Nachricht an den Server zu senden.

  1. Front-End-Interaktion implementieren

Wir werden jQuery verwenden, um Front-End-Interaktion zu implementieren und Spielnachrichten an den Server zu senden.

Das Folgende ist die Implementierung der handleMessage-Funktion:

function handleMessage(message) {
    var json = $.parseJSON(message);
    var action = json.action;
    switch (action) {
        case "hello":
            var name = json.name;
            console.log("Player " + name + " joined the game.");
            break;
        case "bye":
            var playerName = json.name;
            console.log("Player " + playerName + " left the game.");
            break;
        default:
            console.log("Unknown action: " + action);
            break;
    }
}

$(document).ready(function() {
    connectWebSocket();

    $("#btnHello").click(function(event) {
        var playerName = $("#txtName").val();
        var message = '{"action": "hello", "name": "' + playerName + '"}';
        sendMessage(message);
    });

    $("#btnBye").click(function(event) {
        var playerName = $("#txtName").val();
        var message = '{"action": "bye", "name": "' + playerName + '"}';
        sendMessage(message);
    });
});

In dieser Implementierung verwenden wir die $.parseJSON-Funktion von jQuery, um die empfangene Nachricht in das JSON-Format zu analysieren. Anschließend überprüfen wir das Feld „Aktion“ der Nachricht und führen basierend auf den verschiedenen Vorgängen die entsprechende Aktion aus. Wenn die Aktion „Hallo“ lautet, erhalten wir den Namen des Spielers aus der Nachricht und drucken die Nachricht aus, um am Spiel teilzunehmen. Wenn die Aktion „Tschüs“ lautet, erhalten wir auch den Namen des Spielers aus der Nachricht und drucken die Nachricht beim Verlassen des Spiels aus. Andernfalls geben wir eine Meldung für einen unbekannten Vorgang aus.

我们还将为两个按钮分别定义单击事件,这些事件将生成相应的JSON消息并使用'use SendMessage()函数向服务器发送消息。

  1. 测试

现在我们已经完成了Java Websocket实现在线游戏的所有工作。我们需要在Tomcat服务器上启动我们的应用程序并在浏览器中打开前端页面。我们可以使用多个浏览器测试在线游戏的功能。

下面是完整的游戏前端代码,供您参考:

<!doctype html>
<html>
<head>
    <title>WebSocket Chat</title>
    <meta charset="utf-8"/>
    <script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
    <script src="websockets.js"></script>
    <script>
        $(document).ready(function() {
            connectWebSocket();

            $("#btnHello").click(function(event) {
                var playerName = $("#txtName").val();
                var message = '{"action": "hello", "name": "' + playerName + '"}';
                sendMessage(message);
            });

            $("#btnBye").click(function(event) {
                var playerName = $("#txtName").val();
                var message = '{"action": "bye", "name": "' + playerName + '"}';
                sendMessage(message);
            });
        });

        function handleMessage(message) {
            var json = $.parseJSON(message);
            var action = json.action;
            switch (action) {
                case "hello":
                    var name = json.name;
                    console.log("Player " + name + " joined the game.");
                    break;
                case "bye":
                    var playerName = json.name;
                    console.log("Player " + playerName + " left the game.");
                    break;
                default:
                    console.log("Unknown action: " + action);
                    break;
            }
        }
    </script>
</head>
<body>
    <div>
        <label>Player name:</label>
        <input type="text" id="txtName"/>
        <button id="btnHello">Join game</button>
        <button id="btnBye">Leave game</button>
    </div>
</body>
</html>

结论

这篇文章主要介绍了使用Java Websocket实现在线游戏的过程。我们在Java 8和Tomcat 8中开发了一个简单的“chat”游戏,并使用HTML5和JavaScript实现了前端。我们展示了如何使用WebSocket端点,如何管理游戏会话,如何处理游戏消息,如何与前端进行交互,并提供了完整的代码示例。

Das obige ist der detaillierte Inhalt vonWie implementiert Java Websocket Online-Gaming-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn