JDKServer   [w]
JDKClient   [w,a,i,h(udp is not supported)]

SSL通信の利用を可能にしました(要設定)
	SSL化併用動作テスト
		http://ugken.com/cftower/index.html
		https://ugken.com/cftower/index.html


Serverの機能に、ユーザーをセッション管理(チャンネル化)する機能を追加しました
※ネットワークゲームの作り方の入門用サンプルを作りました


================================================================================ * JDKServer / JDKClient Extension * * Javaベースで作られたソケット通信エクステンションです (ver3.2) * 20221128 ================================================================================ 技術的検証の側面が強いエクステンションでしたが、それなりになりました。 通信データに強固な暗号化処理はされていませんので注意が必要です (ver2.0で簡易的な暗号化を施しました) ------------------------------------------------------------ TCP/UDPの通信です バイナリ情報での送信も可能に拡張されました。 HTML5版 Clientもありますが、ブラウザ仕様からUDPは使えません ------------------------------------------------------------ 20221128 ServerLibのバイナリ利用時、floatの扱いに不備があった点を修正しました 20221107 SSL通信の利用を可能にしました(要設定) 20221101 キューバッファの拡張とUDPコネクション数の拡大 20221026 使用CPUの低減と動作の安定化 20221020 メッセージ受信機能を少し仕様変更 20221012 Serverの機能に、ユーザーをセッション管理(チャンネル化)する機能を追加しました ================================================================================ 設置と操作・動作仕様 ================================================================================ ■動作に必要なエクステンションを入れる場所 エディット時に必要な配置(Extensions) C:\Program Files\Clickteam Fusion 2.5\Extensions\Unicode\JDKServer.mfx C:\Program Files\Clickteam Fusion 2.5\Extensions\Unicode\JDKClient.mfx ビルド時に必要な配置(Runtime) C:\Program Files\Clickteam Fusion 2.5\Data\Runtime\Unicode\JDKServer.mfx C:\Program Files\Clickteam Fusion 2.5\Data\Runtime\Unicode\JDKClient.mfx -------------------------------------------------------------------------------- 動作にはJavaが使われていますのでJavaランタイムのインストールが必要です (java 1.6以上) --------------------------------------- ■Javaランタイム 起動時に[Load Error jvm.dll Runtime installed(0)] と出る場合お使いの環境にJAVAランタイムが入っていない為動作できません。 動作にはjavaランタイムの 非64bit版のインストールが必要です https://www.java.com/ja/download/manual.jsp jre-8u341-windows-i586.exe --------------------------------------- ■起動時に関して(windows) Javaランタイムをインストール済み(1.6以上)であるにも関わらず [Load Error jvm.dll Runtime installed(1)] が出る場合は Microsoftより提供されている下記のファイルもインストールする必要があります https://www.microsoft.com/ja-jp/download/details.aspx?id=8328 (Java側jvm.dllがMicrosoftのDLLを呼び出している) --------------------------------------- ================================================================================ 動作仕様 ================================================================================ これらのエクステンションは内部ではグローバルに動作します。 ■共通動作 Action InitVM 利用するjavaLiblaryのパスを指定します(;で複数指定) -------------------------------------------------------------------------------- サーバー操作 -------------------------------------------------------------------------------- ■Server actions(呼び出しイベント) setSSLServerSetting( p12 file , p12 pass_phrase , jks file , jks pass_phrase , port ) SSL設定を有効にした設定を行います。 証明書ファイルの指定やSSL通信を行うポートを指定します。 ・OpenServerによってSSL設定は有効化されます ・CloseServerが呼び出されることによってこの設定は無効化されます ・jdkServerでは、SSL通信ポートと、通常の通信は併用して行われ、ユーザーデータは混在したまま扱う事が出来ます ※jksファイルはjava付属のkeytoolによってjava用の証明書を用意する必要があります。(下部にコラムあり) OpenServer( port , player , keyword ) サーバーを建てます ※使用するポート番号・受け入れるプレイヤ数・接続用キーワード CloseServer サーバーを閉じます userDisconnect(connection_id) 指定番号のクライアントをキックします sendMessage( connection_id , Message ) 指定番号のクライアントにメッセージを送信します sendMessageALL( Message ) 接続中のクライアント全員にメッセージを送信します UDP_sendMessage( connection_id , Message ) 指定番号のクライアントにメッセージをUDPで送信します UDP_sendMessageALL( Message ) 接続中のクライアント全員にメッセージをUDPで送信します ------------ □バイナリパック clearBin バイナリ情報をクリアします pushBinByte 数値情報をBYTEとしてパッキングに追加します(1byte) pushBinShort 数値情報をShortとしてパッキングに追加します(2byte) pushBinInt 数値情報をIntとしてパッキングに追加します(4byte) pushBinLong 数値情報をLongとしてパッキングに追加します(8Byte) pushBinFloat 小数点情報をFloatとしてパッキングに追加します(4byte) pushBinDouble 小数点情報をDoubleとしてパッキングに追加します(8byte) ------------ sendBin( connection_id ) バイナリパックの情報をクライアントに送信します sendBinALL 接続中のクライアント全員にバイナリパックの情報を送信します UDP_sendBin( connection_id ) バイナリパックの情報をUDPでクライアントに送信します UDP_sendBinALL 接続中のクライアント全員にバイナリパックの情報をUDP送信します ------------ □セッション機能 setUserSessionID( connection_id , session_id ) ユーザーをセッショングループ(id)に属させます ユーザー接続時にはセッションidは0に割り当てられています 割り当てられるセッションIDは 0〜254までです getSessionUserList( session_id ) セッションIDに属するユーザーIDを列挙します conditionのGetSessionUserListがユーザー人数分呼び出され ユーザーIDはexpression getUserListIDから取得します getSessionList ユーザーが存在するセッションIDを列挙します conditionのGetSessionListが存在するセッション回呼び出され expression getSessionListIDからセッションIDを取得します sendMessageSession sendBinSession UDP_sendBinSession UDP_sendMessageSession セッションIDに対して送信を行い、属するユーザー全員にメッセージを送信します ------------------------------------------------ ■Server CONDITION(イベント発生時メッセージ) ConnectionPlayer クライアントが接続してきた時に発生するイベントです DisconectPlayer クライアントが切断した時に発生するイベントです ReceiveMessage クライアントからテキストメッセージを受信した時に発生するイベントです ReceiveBinary クライアントからバイナリメッセージを受信した時に発生するイベントです □セッション機能 GetSessionUserList アクションのgetSessionUserList呼び出し時に発生します GetSessionList アクションのgetSessionList呼び出し時に発生します ------------------------------------------------ ■Server expressions(数式エディタから呼び出せる命令) getConnectionID イベントを発生させたクライアントの番号を取得します getReceiveString イベントを発生させたクライアントメッセージを取得します getServerCode サーバーの状態を得る 0:起動中 1:何らかの原因で停止している getUserCount 接続中のユーザー数を取得します checkUserConnect(userConnectId) クライアント番号のユーザーが接続中か確認します(0:いない 1:いる) getLocalIP サーバーのIPを取得します getUserIP(userConnectId) クライアント番号のユーザーIPを取得します getReceiveType 受信した情報タイプを取得します 1:テキスト 2:バイナリ getRecieveBinSize 受信した情報サイズを取得します getBinByte( offset ) 受信したバイナリ情報をオフセット位置から1バイト取得します getBinShort( offset ) 受信したバイナリ情報をオフセット位置から2バイト取得します getBinInt( offset ) 受信したバイナリ情報をオフセット位置から4バイト取得します getBinLong( offset ) 受信したバイナリ情報をオフセット位置から8バイト取得します getBinFloat( offset ) 受信したバイナリ情報をオフセット位置から4バイト取得します getBinDouble( offset ) 受信したバイナリ情報をオフセット位置から8バイト取得します getUDPState UDPの動作状態を返します -1:ポート掴めず 1:処理中 2:OK □セッション機能 getSessionUserCount( session_id ) セッションIDに存在するクライアントの数を取得します getUserSessionID( userConnectId ) クライアントに設定されているセッションIDを取得します -------------------------------------------------------------------------------- クライアント操作 -------------------------------------------------------------------------------- ■Client actions(呼び出しイベント) setSSLClientSetting( p12 file , p12 pass_phrase , jks file , jks pass_phrase ) SSL通信による接続設定が行えます。 クライアント証明書を使用する場合に各パラメーターを指定する事が出来ます。 (""で埋める事で、デフォルト設定によるSSL通信を行えます) openConnectionによってSSL通信による接続に切り替わります。(サーバーとは異なり、こちらの接続はどちらかのみです) closeConnectionが呼び出されることにより、このSSL設定は無効化されます。 openConnection( ip , port , keyword ) サーバーへ接続します (接続先IPアドレス・ポート番号・接続用キーワード) closeConnection サーバーから切断します sendMessage(msg) サーバーへメッセージを送信します UDP_sendMessage(msg) サーバーへメッセージを送信します(UDP) ------------ □バイナリパック clearBin バイナリ情報をクリアします pushBinByte 数値情報をBYTEとしてパッキングに追加します(1byte) pushBinShort 数値情報をShortとしてパッキングに追加します(2byte) pushBinInt 数値情報をIntとしてパッキングに追加します(4byte) pushBinLong 数値情報をLongとしてパッキングに追加します(8Byte) pushBinFloat 小数点情報をFloatとしてパッキングに追加します(4byte) pushBinDouble 小数点情報をDoubleとしてパッキングに追加します(8byte) ------------ sendBin サーバーへバイナリパックを送信します ------------------------------------------------ ■Client CONDITION(イベント発生時メッセージ) Connected サーバーに接続した時に発生するイベントです Disconect サーバーから切断されたときに発生するイベントです ReceiveMessage サーバーからテキストメッセージを受信した時に発生するイベントです ReceiveBinary サーバーからバイナリメッセージを受信した時に発生するイベントです ------------------------------------------------ ■Client expressions(数式エディタから呼び出せる命令) getConnectionID サーバーから自分に割り振られているクライアント番号を取得します getReceiveString サーバーから受信したメッセージを取得します checkClientError クライアントが動作しているかチェックします(0:作動中 1:停止中) getLastConnectionState 現在のクライアントの状態番号を得ます(-1:接続先が無い 1:接続中 2:接続完了 3:切断済み) getLocalIP IPアドレスを得ます getReceiveType 受信した情報タイプを取得します 1:テキスト 2:バイナリ getRecieveBinSize 受信した情報サイズを取得します getBinByte( offset ) 受信したバイナリ情報をオフセット位置から1バイト取得します getBinShort( offset ) 受信したバイナリ情報をオフセット位置から2バイト取得します getBinInt( offset ) 受信したバイナリ情報をオフセット位置から4バイト取得します getBinLong( offset ) 受信したバイナリ情報をオフセット位置から8バイト取得します getBinFloat( offset ) 受信したバイナリ情報をオフセット位置から4バイト取得します getBinDouble( offset ) 受信したバイナリ情報をオフセット位置から8バイト取得します getUDPState UDPの動作状態を返します -1:ポート掴めず 1:処理中 2:OK ================================================================================ * SSL通信に必要な証明書なファイルについて ================================================================================ SSL設定を有効化する為にsetSSLClientSettingに2つの証明書ファイルを用意する必要があります。 p12証明書ファイルについてはopensslにより作成できます。 #openssl pkcs12 -export -in cert.pem -inkey privkey.pem -certfile chain.pem -out ugken.p12 jksファイルについてはjavaSDKに付属のkeytoolを使い、p12ファイルからjksを作成します。 #keytool -importkeystore -srckeystore ugken.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -deststoretype JKS javaのkeytoolのデフォルトパスワードは、変更していない限り"changeit"です ================================================================================ * 技術的な解説など ================================================================================ DLL(エクステンション)からDLL(JAVA VM)を呼び出している関係上 実行環境に左右される恐れがあります。 個人環境でのデバッグのみなので、不具合がまだあるかもしれません HTML5ではUDPを使えませんが、TCP部分に関しては繋がるので場合によっては有効かもしれません。 個人でデバッグ調整するには困難なので 配布はフィードバックが頂ける方に絞ろうかと思います。 javaライブラリなので常駐型のサーバーコードを書けば、Linux上など別のプラットフォームからの連動も可能です。 (DB連動型のユーザー管理も可能となるでしょう) 動作確認及び、実験に手伝って下さった方に感謝致します。 DOWNLOAD OLDVER OLDVER