Javaソケットフレームワーク

すべての良い一日。 オンラインの3Dゲームを開発しています。Javaプラットフォームが選択されました。 3Dでは、jmonkeyengineエンジンが選択されました。 そして、サーバー側として、単純なp2pフレームワーク、クライアントでの表現の実装を備えたMVCを作成することにしました。





例とドキュメントを含む更新されたブログ:

java-framework-jsocket.blogspot.com



便利な場合:



1.モバイルサービス用のサーバー。

2. p2pが必要なマルチユーザーアプリケーション。

3.オンラインゲーム。

4.必要に応じて急流。



チャート:

画像



動作原理:



1.クライアントは、変数と呼び出すタスクをリストしたメッセージをサーバーに送信します。

2.メッセージは、着信メッセージのキューに分類されます。

3.ルーターは、これらの変数を使用して目的のタスクを開始します。

4.タスクでは、ユーザーに応答を送信します。



追加機能:



1.クライアントとサーバーのポートを構成します。

2.データベースモデル。

3.着信メッセージの検証。

4.ユーザーの権利。

5.モジュール。

6.セッションのメカニズム。

7.チーム。

8. tcp / udpプロトコルを変更します。



手順、例、ドキュメント



http://jsockframework.blogspot.com/

https://github.com/nnpa/jsock/

youtube

jsock.doc



メッセージの送受信の例



顧客:



//client /* * jsock framework https://github.com/nnpa/jsock open source * Each line should be prefixed with * */ package jsock.tests; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Iterator; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; import conf.JConfig; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; /** * * @author padaboo IB Aleksandrov jetananas@yandex.ru */ public class JClientTCPTest { public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{ JClientTCPTest tcpTest = new JClientTCPTest(); tcpTest.test(); } public void test(){ Sender sender = new Sender(); sender.start(); Receiver receiver = new Receiver(); receiver.start(); } class Sender extends Thread{ @Override public void run(){ try { InetAddress host = InetAddress.getLocalHost(); Socket socket = null; String message; for(int i=1; i<10;i++){ message = "{\"task\":\"JTestTask\",\"message\":\"test"+i+"\"}"; socket = new Socket(host.getHostName(), JConfig.server_port); //InputStream inStream = socket.getInputStream(); PrintWriter socketOut; socketOut = new PrintWriter(socket.getOutputStream(), true); socketOut.println(message); socket.close(); System.out.println("Send: "+i); Thread.sleep(100); } } catch ( IOException | InterruptedException ex) { Logger.getLogger(JClientTCPTest.class.getName()).log(Level.SEVERE, null, ex); } } } class Receiver extends Thread{ JSONObject jsonObj; JSONParser parser; @Override public void run(){ try { ServerSocket serverSocket = new ServerSocket(JConfig.client_port); String data = ""; while(true){ data = ""; Socket socket = serverSocket.accept(); InputStream inStream = socket.getInputStream(); Scanner scanner = new Scanner(inStream); while(scanner.hasNextLine()){ data += scanner.nextLine(); } System.out.println(data); } } catch (IOException ex) { Logger.getLogger(JClientTCPTest.class.getName()).log(Level.SEVERE, null, ex); } } } }
      
      





サーバー:



 package tasks; import jsock.message.JInMessages; import jsock.message.JOutMessages; import jsock.task.JClientTask; import models.Users; /** * * @author padaboo IB Aleksandrov jetananas@yandex.ru */ public class JTestTask extends JClientTask{ public JTestTask(JInMessages message) { super(message); } @Override public String[][] rules(){ String[][] rules = { {"require","message"} }; return rules; } @Override public String rights() { //String rigths = "user,admin"; String rigths = "guest"; return rigths; } @Override public void action(){ String message = this.message.json.get("message").toString(); System.out.println(message); String outString = "{\"message\":\"Test\"}"; JOutMessages outMessage = new JOutMessages(this.message.ip,outString); outMessage.insert(); } }
      
      





1.クライアントは、呼び出されたタスクの名前を含む文字列をjsonサーバーに送信します。

2.タスクはメッセージから変数を抽出し、応答を送信します。



挑戦する



タスクは、tasksフォルダーに作成し、JClientTaskから継承する必要があります。 コンストラクターは、着信メッセージとともにJInMessagesクラスを渡す必要があります。 ルール、権利、アクションメソッドを実装する必要があります。 ルールは変数を検証するためのルールを記述します;独自の検証ルールを書くことができます。 権利では、アクションを引き起こす権利を持つユーザーの権利のリスト。

アクションではメインコード。



変数を抽出する



  String message = this.message.json.get("message").toString();
      
      





返信とキュー文字列



 String outString = "{\"message\":\"Test\"}"; JOutMessages outMessage = new JOutMessages(this.message.ip,outString); outMessage.insert();
      
      





ipの代わりに、ソケットでリッスンし、json文字列を待機する任意のipを配置できます。



モデル



指示に従ってフレームワークをインストールすると、データベースに2つのテーブル、Users、Sessionが作成されます。 使用例は、タスクのあるフォルダーです。



すべてのモデルは、データベース接続と基本メソッドを実装するDBQueryから継承したモデルフォルダーに作成する必要があります。 モデルクラスでは、データベースとの対話のロジックを実装する必要があります。



ユーザー権利



1.権利は、権利メソッドのタスク(ゲスト、ユーザー、管理者)で説明する必要があります。 権限のないユーザーにはゲスト権限があります。 登録されたユーザーにはユーザーが割り当てられ、これらの値はデータベースの権利テーブルに保存されます。



例:トークン、モデル、権利による承認



受信トークン



 @Override public void action(){ String email = this.message.json.get("email").toString(); String password = this.message.json.get("password").toString(); Users users = new Users(); boolean isAuth = users.authorization(email,password); String outString; if(isAuth){ String token = users.getToken(); int userId = users.id; String ip = this.message.ip; //System.out.println(insertQuery); Session session = new Session(); session.setToken(userId, token,ip); outString = "{\"token\":\"" + token +"\"}"; }else{ outString = "{\"error\":\"Incorrect login or password \"}"; } JOutMessages outMessage = new JOutMessages(this.message.ip,outString); outMessage.insert(); }
      
      





1.権利は、期待される変数を示します:電子メール、パスワード。

2.ユーザーモデルを作成し、認証方法を呼び出します。

3.セッションモデルを作成します-トークンを取得します。

4.回答を送信します。

5.トークンはクライアントに保存されます。



権限を確認し、特定のIPにメッセージを送信する例



 @Override public void action(){ /** * get ip from session and send to open socket **/ System.out.println("user_id: " + webUser.id + " email: " + webUser.email + " rights: "+ webUser.rights); Session session = new Session(); session.findByUserID(12); String ip = session.ip; //all users //session connection String outString = "{\"ip_message\":\"send to user by session id\"}"; JOutMessages outMessage = new JOutMessages(ip,outString); outMessage.insert(); }
      
      





1.権限でユーザーを指定します。

2.予想されるトークン変数



トークンと「ゲストではない」権限でタスクを呼び出した後。 ユーザーはセッションテーブルのデータベースで検索され、ユーザーモデルはuser_idによって作成されます。これは、webUser変数のタスクで使用できます。



Sessionのuser_idまたはJConnectionsクラスの接続により、すべてのクライアントにメッセージを送信できます。



登録の例は、tasks.JRegistrationTaskクラスにあります。 すべてのテストは/ tests /フォルダーにあります。 より詳細な例については、メッセージの冒頭にあるリンクを参照してください。



UPD:フレームワークの更新、バグ修正、新機能の追加

UPD:チュートリアルの作成を開始しました: jsock-framework-tutorial.blogspot.com/2019/02/jsock-framework.html



All Articles