Marauroa Chat Tutorial/Text Client
Marauroa Tutorial
編碼[編輯]
為了使用Marauroa框架字創建客戶端,您應該使用您的邏輯擴展marauroa.client.ClientFramework類。 這是聊天客戶端的原始碼
import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.LinkedList; import marauroa.client.ClientFramework; import marauroa.client.net.IPerceptionListener; import marauroa.client.net.PerceptionHandler; import marauroa.common.game.RPAction; import marauroa.common.game.RPObject; import marauroa.common.net.message.MessageS2CPerception; import marauroa.common.net.message.TransferContent; public class Client extends ClientFramework { private PerceptionHandler handler; private static Client client; private Map<RPObject.ID, RPObject> worldObjects; private String[] availableCharacters; private LinkedList<String> quotes = new LinkedList<String>(); public static Client get() { if (client == null) { client = new Client(); } return client; } protected Client() { super("log4j.properties"); worldObjects = new HashMap<RPObject.ID, RPObject>(); handler = new PerceptionHandler(new PerceptionListener()); } public String[] getAvailableCharacters() { return availableCharacters; } public String popQuote() { if (quotes.isEmpty()) { return null; } return quotes.pop(); } public void sendMessage(String text) { RPAction action; action = new RPAction(); action.put("type", "chat"); action.put("text", text); send(action); } @Override protected void onPerception(MessageS2CPerception message) { try { handler.apply(message, worldObjects); } catch (java.lang.Exception e) { // Something weird happened while applying perception } } @Override protected List<TransferContent> onTransferREQ(List<TransferContent> items) { return items; } @Override protected void onTransfer(List<TransferContent> items) { } @Override protected void onAvailableCharacters(String[] characters) { availableCharacters = characters; } @Override protected void onServerInfo(String[] info) { for (String s : info) { quotes.add(s); } } @Override protected String getGameName() { return "Chat"; } @Override protected String getVersionNumber() { return "0.5"; } @Override protected void onPreviousLogins(List<String> previousLogins) { } class PerceptionListener implements IPerceptionListener { @Override public boolean onAdded(RPObject object) { if (object.has("text")) { quotes.add("*" + object.get("from") + "* : " + object.get("text")); } return false; } @Override public boolean onModifiedAdded(RPObject object, RPObject changes) { return false; } @Override public boolean onModifiedDeleted(RPObject object, RPObject changes) { return false; } @Override public boolean onDeleted(RPObject object) { return false; } @Override public boolean onMyRPObject(RPObject added, RPObject deleted) { return false; } @Override public void onSynced() { } @Override public void onUnsynced() { } @Override public void onException(Exception e, MessageS2CPerception perception) { e.printStackTrace(); System.exit(-1); } @Override public boolean onClear() { return false; } @Override public void onPerceptionBegin(byte type, int timestamp) { } @Override public void onPerceptionEnd(byte type, int timestamp) { } } }
這主要是樣板代碼。 我們聲稱我們是「聊天」客戶端,版本為「 0.5」。您還記得,我們的伺服器將接受任何「聊天」客戶端,而沒有版本限制。
您應該注意的是,我們使用了Marauroa提供的感知處理程序,請參見onPerception。 我們仍然引入了自己的感知偵聽器,以便在添加,修改或刪除對象時能夠採取措施。
PerceptionListener是我們的實現。 我們僅使用onAdded處理程序,該處理程序允許我們在出現新對象時做出反應,即將新的聊天消息添加到消息列表中。 在其他處理程序中返回的假值非常重要,因為它們向Marauroa表示您要繼續當前操作(例如添加對象)。
收到的所有消息都存儲在消息列表中。 一個人可以使用popQuote()方法一一訪問存儲的消息.
最後,您可以使用SendMessage方法發送消息。 它構造伺服器可理解的RPAction並將其發送。
Marauroa框架為伺服器提供了主要方法,因此您無需關心執行循環。 對於客戶端而言並非如此,因此我們還需要實現客戶端的主要模塊。 這是一個非常簡單的解決方案
import marauroa.common.game.RPObject; public class Test { public static void main(String[] args) { boolean runClient = true; Client client = Client.get(); try { client.connect("localhost", 5555); if (args.length == 3) { client.createAccount(args[0], args[1], args[2]); } client.login(args[0], args[1]); if (client.getAvailableCharacters().length == 0) { RPObject character = new RPObject(); client.createCharacter(args[0], character); } client.chooseCharacter(args[0]); } catch (Exception e) { runClient = false; } int i = 0; while (runClient) { i++; client.loop(0); if (i % 100 == 50) { client.sendMessage("test" + i); } String s = client.popQuote(); while (s != null) { System.out.println(s); s = client.popQuote(); } try { Thread.sleep(100); } catch (InterruptedException e) { runClient = false; } } } }
我們的main方法做兩件事。 首先,如果提供了三個命令行參數(登錄,密碼,電子郵件),我們將創建一個新帳戶。 否則,我們僅使用指定的登錄名和密碼登錄。
然後是時候選擇一個角色了。 如果伺服器報告該帳戶沒有可用的角色,那麼我們將創建一個新名稱,該名稱與帳戶名稱相同。 請注意,不可能直接在Client類的onAvailableCharacters處理程序中選擇角色。
隨後開始心跳循環。 在每一步中,我們都調用loop(0),其中浮點參數在這一點上沒有任何意義。 每100步,我們就會向伺服器發送一條消息。 沒有互動的方式來控制消息,但是看到您自己的客戶端創建的聊天仍然令人讚嘆。
部署[編輯]
運行客戶端非常簡單,您只需要一堆jar(客戶端不需要資料庫)和已編譯的客戶端代碼。 我使用以下行進行編譯
javac -cp marauroa.jar;log4j.jar;. *.java
確保所需的jar位於當前目錄中。 運行使用
java -cp marauroa.jar;log4j.jar;h2.jar;. Test login password
同樣,在Linux和MacOSX上,所有「;」 必須替換為「:」。
不要忘記用實際的登錄名和密碼替換。 要創建一個新帳戶,只需添加第三個命令行參數(應該是電子郵件,但目前尚無驗證)。.
輸出[編輯]
理想情況下,您應該會看到類似
>java -cp marauroa.jar;log4j.jar;h2.jar;. Test test1 test1 Cannot find log4j.properties in classpath. Using default properties. *test1* : test50 *test1* : test150 *test1* : test250 ...
請注意有關log4j.properties的消息:您可以創建該文件以便在Marauroa框架內配置Log4J用法.
下一步[編輯]
在本教程的下一部分中,我們將編寫一個 Swing 客戶端 它帶有圖形用戶接口. {{#breadcrumbs: Marauroa | 使用 | 教程 | 文本客戶端}}