ネットワーク通信の概要オンライン ゲームを開発する場合、必然的にネットワーク通信に対処する必要があります。注意すべき問題がいくつかあります: 1. 迅速な開発のため、サーバーは初期段階では http 通信を使用し、後で websocket/socket に変更する場合があります。 2. httpとwebsocket/socket通信の両方が存在する 3. 通信データ形式はいつでも JSON またはプロトコル バッファに置き換える必要があり、追加のヘッダーを追加する必要が生じる場合があります。 4. 初心者ガイドのシミュレーションにはローカル データを使用するため、リクエストをバックエンドに送信する必要はありません。 5. 再接続後の簡単なデータ同期 具体的な実装1 番目と 2 番目の質問に関して、通信モジュールを設計する際には、通信を可能な限り統一された外部インターフェイスに抽象化し、ゲーム開始時に異なるドライバーを通じてインスタンスを作成することを検討します (通信方法が 1 つだけの場合は、単一のインスタンスを使用します)。 パブリックコンストラクタ(ドライバ: ConnectDriver) { this._driver = ドライバー; } まず、一般的なネットワーク通信データ構造を定義します。リクエストはデータと制御の 2 つのタイプに分かれており、ハートビート、ログイン、再接続を区別するために使用されます。 /** * リクエストタイプ */ エクスポート列挙型リクエストタイプ{ データ = 1、 Ctrl } /** * ネットワーク通信データ構造 */ エクスポートインターフェースNetData { seq?: number; // シリアル番号 mod: number; // モジュール cmd: number; // コマンド path?: string; // パス data?: any; // データ tmpData?: any; // データプロセッサの一時データ status?: number; // ステータスコード type?: RequestType; // リクエストタイプ} 次に共通の外部インターフェースを定義します パブリックオープン(url: 文字列、ポート: 数値、isBinary: ブール値、タイムアウト: 数値、再試行回数: 数値、パラメーター: 任意、cb: (succ: ブール値) => void): void {} パブリックclose(): 数値{} パブリック再オープン(cb: (succ: boolean) => void): void {} パブリック sendData(データ: NetData、パラメーター: HttpReq | any、succCb: (データ: NetData) => void、failedCb: (コード: 数値、理由: 文字列) => void): void {} パブリック resendNotRecv(): void {} resendNotRecv は、再接続後に応答を受信しなかったパケットを送信するために使用され、バックエンドはシーケンス番号に基づいてそれを処理するかどうかを決定します。 ここではプッシュ処理は行われません。実際には、プッシュはサーバーのデータを受信した後にリスナーにブロードキャストを呼び出すことです。以下はリスナーの定義です /** * ネットワーク接続イベント監視インターフェース */ エクスポートインターフェースConnectEventListener { onOpen(ドライバ: ConnectDriver); onClosed(ドライバー: ConnectDriver); onError(ドライバー: ConnectDriver、メッセージ: 文字列); onSendStart(ドライバー: ConnectDriver); onRecvEnd(ドライバー: ConnectDriver); } /** * ネットワークイベント監視インターフェース */ エクスポートインターフェース NetEventListener は ConnectEventListener を拡張します { onPush(ドライバー: ConnectDriver、データ: NetData): void; } 外部関係者に登録および削除インターフェースを提供する パブリックaddEventListener(リスナー: NetEventListener): void {} パブリックremoveEventListener(リスナー: NetEventListener): void {} 3 番目の問題については、データを送信する前とデータを受信した後に傍受と前処理を実行するためのプリプロセッサをいくつか定義する必要があります。 /** * ネットワーク通信データプロセッサインターフェース */ エクスポートインターフェースNetDataProcessor { プロセス要求データ(データ: 任意): 任意; プロセス応答データ(データ: 任意): 任意; } 外部への追加および削除インターフェースを提供し、通信データ形式を柔軟に定義できるようにします。 パブリックaddDataProcessor(プロセッサ: NetDataProcessor): void {} パブリックremoveDataProcessor(プロセッサ: NetDataProcessor): void {} 4 番目の問題に関しては、リクエストが送信される前にそれを処理する特別なインターセプターも追加します。インターセプターがそれを処理できる場合、リクエストはバックエンドに送信されなくなります。 /** * サーバーインターフェースをシミュレートする */ エクスポートインターフェースSimServer{ handleRequest(データ: NetData): NetData; } 外部設定インターフェースを提供する パブリック setSimServer(サーバー: SimServer): void {} 5 番目の質問については、すべてのデータ要求にシリアル番号が付けられ、要求が記録され、応答のない要求パケットはキューに配置されます。再接続後、これらのパケットは処理のためにバックエンドに再送信されます。 パブリック resendNotRecv(): void {} 以上がCocosCreator入門チュートリアルにおけるネットワーク通信の詳しい内容です。CocosCreatorネットワーク通信の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法
>>: Linuxのsortコマンドの複数のパラメータを理解するための1つの質問
Python プログラムを書き、Mysql ライブラリを集中的に操作したためです。データ量が多くない...
実験環境ApacheとTomcatは両方ともIPアドレス192.168.153.136のホストにイン...
序文トップメニューを作成する場合、ポップアップのセカンダリメニューを作成する必要があります。 以前の...
この記事では、弾性ナビゲーション効果を実現するためのJavaScriptの具体的なコードを参考までに...
この記事では主に、ElementUI テーブルのヘッダー アイコンにフローティング プロンプトを追加...
コンテナが企業の IT インフラストラクチャに欠かせない要素となっていることは間違いありません。コン...
filterは通常、特定の値をフィルターするために使用されます。たとえば、フィールドが空だが、フロン...
ロケーションは「位置指定」を意味し、主にさまざまな位置指定のための URI に基づいています。これは...
場合によっては、リモート マシンでいくつかのコマンドを実行する必要があることがあります。これが時々行...
この記事では、MySQL 8.0.15 winx64解凍版のインストールと設定方法を紹介します。具体...
Vue+iview メニューとタブのリンク現在、vue+iview を使用してバックエンド管理システ...
http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...
Docker サービス アプリケーションを再起動するコマンドを見てみましょう。具体的な内容は次のと...
概要プロトタイプ パターンは、プロトタイプ インスタンスによって作成されるオブジェクトの型を指し、こ...
導入保存時と読み取り時に CHAR 型と VARCHAR 型の違いを本当にご存知ですか?まずいくつか...