ホームページ  >  記事  >  Java  >  Java Websocket はオンライン ゲーム機能をどのように実装しますか?

Java Websocket はオンライン ゲーム機能をどのように実装しますか?

王林
王林オリジナル
2023-12-02 14:44:381580ブラウズ

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

Java Websocket は、TCP プロトコルに基づく全二重通信プロトコルであり、永続的な接続で双方向通信を実現できます。ゲームでは高速な対話とリアルタイム通信が必要となるため、Java Websocket はリアルタイム オンライン ゲームの開発に非常に適しています。

この記事では、Java Websocket を使用してオンライン ゲーム機能を実装する方法を紹介します。開発環境として Java 8 と Tomcat 8 を使用し、フロントエンド ページには HTML5 と JavaScript を使用します。

  1. WebSocket 接続の確立

まず、WebSocket 接続を作成する必要があります。この機能は、WebSocket エンドポイントを作成することで実現できます。 JavaWeb アプリケーションでは、javax.websocket.Endpoint を使用して Websocket エンドポイントを構成できます。

Websocket エンドポイントの実装は次のとおりです:

@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();
    }
}

このエンドポイントでは、4 つのアノテーションを定義します:

  • @ServerEndpoint("/game") 定義このエンドポイントへのパスは「/game」です。
  • @OnOpen は、WebSocket 接続をマネージャーに追加するなど、WebSocket が開かれたときにこのエンドポイントが行う動作を定義します。
  • @OnMessage は、接続されているすべての WebSocket クライアントにメッセージを送信するなど、WebSocket がメッセージを受信したときにこのエンドポイントが行う動作を定義します。
  • @OnClose は、マネージャーから WebSocket 接続を削除するなど、WebSocket が閉じられたときにこのエンドポイントが行う動作を定義します。
  • @OnError は、WebSocket エラーが発生したときにこのエンドポイントが行う動作を定義します。

注: これは単なる例であり、実際のアプリケーションではさらに多くのエラー処理とセキュリティ チェックを実行する必要があります。

  1. ゲーム セッションの管理

ゲーム セッションを管理するには、GameSessionManager クラスを作成する必要があります。 GameSessionManager は、すべての WebSocket 接続を管理し、ゲーム関連のメッセージを処理するために使用されるシングルトン クラスです。

以下は 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();
        }
    }
}

このクラスでは、すべての WebSocket セッションを保存するための Session コレクションを作成します。 getInstance() メソッドを使用して、GameSessionManager のシングルトン オブジェクトを取得します。 WebSocket 接続を追加または削除する場合は、コレクションに対して接続を追加または削除するだけです。メッセージをブロードキャストするときは、すべての WebSocket セッションをループして、それぞれの WebSocket セッションにメッセージを送信します。メッセージを送信するときは、session.getBasicRemote() メソッドを使用して基本リモート ポートを取得し、次に sendText() メソッドを呼び出してメッセージをクライアントに送信します。

  1. ゲーム メッセージの処理

クライアントからのゲーム メッセージを GameSessionManager クラスで処理し、クライアントに送り返します。ここではゲームロジックについても扱います。

ここでは、例として「こんにちは」と「さようなら」操作を含む単純な「チャット」ゲームを示します。

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;
    }
}

この実装では、最初に受信したメッセージを JSON 形式として解析します。次に、メッセージの「アクション」フィールドを確認し、さまざまな操作に基づいて適切なアクションを実行します。アクションが「hello」の場合、メッセージからプレーヤーの名前を取得し、ブロードキャスト メソッドを使用してすべてのプレーヤーにウェルカム メッセージを送信します。操作が「さようなら」の場合、メッセージからプレイヤーの名前も取得し、ブロードキャスト メソッドを使用してすべてのプレイヤーにお別れのメッセージを送信します。それ以外の場合は、不明な操作を示すメッセージが出力されます。

  1. フロントエンド ページの構築

フロントエンド ページは、HTML5 と JavaScript を使用して実装されます。 WebSocket を実装する JavaScript クラスを作成する必要があります。 JavaWeb アプリケーションでは、JavaScript の WebSocket オブジェクトを使用して WebSocket 接続を作成できます。

WebSocket を実装する JavaScript クラスは次のとおりです:

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.");
    }
}

この実装では、まず WebSocket がサポートされているかどうかを確認します。その場合は、WebSocket のコンストラクターを使用して WebSocket オブジェクトを作成し、それを webSocket 変数に割り当てます。 3 つの WebSocket イベント ハンドラーを定義しました。

  • websocket.onopen WebSocket が開かれたときに実行される操作 (サーバーへの接続要求の開始など)。
  • websocket.onmessage は、メッセージを処理するための handleMessage 関数の呼び出しなど、メッセージの受信時に WebSocket によって実行される操作を定義します。
  • websocket.onclose は、再接続の試行など、WebSocket が閉じられたときの動作を定義します。

また、WebSocket オブジェクトの send メソッドを使用してメッセージをサーバーに送信する sendMessage 関数も定義します。

  1. フロントエンド インタラクションの実装

jQuery を使用してフロントエンド インタラクションを実装し、ゲーム メッセージをサーバーに送信します。

次は、handleMessage 関数の実装です:

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);
    });
});

この実装では、jQuery の $.parseJSON 関数を使用して、受信したメッセージを JSON 形式に解析します。次に、メッセージの「アクション」フィールドを確認し、さまざまな操作に基づいて適切なアクションを実行します。アクションが「hello」の場合、メッセージからプレイヤーの名前を取得し、ゲームに参加するためのメッセージを出力します。アクションが「バイ」の場合、メッセージからプレイヤーの名前も取得し、ゲームを終了するメッセージを出力します。それ以外の場合は、不明な操作を示すメッセージが出力されます。

我们还将为两个按钮分别定义单击事件,这些事件将生成相应的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端点,如何管理游戏会话,如何处理游戏消息,如何与前端进行交互,并提供了完整的代码示例。

以上がJava Websocket はオンライン ゲーム機能をどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。