欢迎访问宙启技术站
智能推送

Autobahn Android的一个应用示范和全局化

发布时间:2023-05-17 05:48:21

Autobahn是一个广泛使用的WebSocket实现库,允许应用程序通过WebSockets在Web浏览器和服务器之间进行双向通信。Autobahn Android是一个Autobahn库的Android版,允许Android应用程序使用WebSockets进行通信。本文将向你展示如何使用Autobahn Android的一个示例应用程序,并且将探讨如何将该应用程序全球化。

Autobahn Android的示例应用程序:

这个示例应用程序演示了如何使用Autobahn Android进行WebSockets通信。该应用程序有两个部分:客户端和服务器。

客户端:

客户端使用Autobahn Android创建一个WebSockets连接,然后向服务器发送一个消息。一旦服务器接收到消息,它会回复该消息。客户端将接收到服务器的响应,并将其显示在应用程序中。

以下是客户端的代码:

public class MainActivity extends AppCompatActivity implements WampRouterListener {
?
????private WebSocketConnection mWebSocketConnection;
????private WampRouter mWampRouter;
?
????@Override
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);
?
????????mWebSocketConnection = new WebSocketConnection();
?
????????try {
????????????URI uri = new URI("ws://localhost:8080/ws");
?
????????????mWebSocketConnection.connect(uri, new WebSocketHandler() {
????????????????@Override
????????????????public void onOpen() {
????????????????????Log.d("WS", "onOpen: Connection opened.");
????????????????????mWampRouter = new WampRouter(mWebSocketConnection);
????????????????}
?
????????????????@Override
????????????????public void onClose(int code, String reason) {
????????????????????Log.d("WS", "onClose: Connection closed. Code: " + code + ". Reason: " + reason);
????????????????}
?
????????????????@Override
????????????????public void onTextMessage(String payload) {
????????????????????Log.d("WS", "onTextMessage: Message received: " + payload);
????????????????????runOnUiThread(new Runnable() {
????????????????????????@Override
????????????????????????public void run() {
????????????????????????????TextView textView = findViewById(R.id.textView);
????????????????????????????textView.setText(payload);
????????????????????????}
????????????????????});
????????????????}
????????????});
????????} catch (Exception e) {
????????????Log.e("WS", "onCreate: Error connecting to WebSocket server.", e);
????????}
????}
?
????@Override
????public void onWelcome(long sessionId, Map<String, Object> details) {
????????Log.d("WS", "onWelcome: Session ID: " + sessionId + ". Details: " + details.toString());
?
????????List<Object> args = new ArrayList<>();
????????args.add("Hello, server!");
?
????????Map<String, Object> kwargs = new HashMap<>();
?
????????mWampRouter.call("com.example.say_hello", args, kwargs, new WampRouterListener() {
????????????@Override
????????????public void onResult(Object result) {
????????????????Log.d("WS", "onResult: Call succeeded. Result: " + result.toString());
????????????}
?
????????????@Override
????????????public void onError(String error) {
????????????????Log.d("WS", "onError: Call failed. Error: " + error);
????????????}
????????});
????}
}

服务器:

服务器使用Autobahn Python创建一个WebSockets连接,并使用Crossbar.io作为路由器。一旦服务器接收到客户端发送的消息,它会回复一个响应。

以下是服务器的代码:

from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
from autobahn.wamp import ApplicationSession, ApplicationRunner
?
class MyServerProtocol(WebSocketServerProtocol):
?
????def onConnect(self, request):
????????print("Client connected: {}".format(request.peer))
?
????def onClose(self, was_clean, code, reason):
????????print("Connection closed: {} {} {}".format(was_clean, code, reason))
?
????def onMessage(self, payload, is_binary):
????????if not is_binary:
????????????msg = payload.decode("utf-8")
????????????print("Message received: {}".format(msg))
????????????if msg == "Hello, server!":
????????????????self.sendMessage("Hello, client!".encode("utf-8"), isBinary=False)
?
class MyApplicationSession(ApplicationSession):
?
????def onConnect(self):
????????print("Connected to Crossbar.io")
????????self.join("realm1")
?
????def onJoin(self, details):
????????print("Session joined: {}".format(details))
?
????????def say_hello(msg):
????????????print("Function called: {}".format(msg))
????????????return "Hello, client!"
?
????????self.register(say_hello, "com.example.say_hello")
?
if __name__ == "__main__":
????factory = WebSocketServerFactory("ws://localhost:8080/ws")
????factory.protocol = MyServerProtocol
????runner = ApplicationRunner(url=u"ws://localhost:8181/ws", realm=u"realm1")
????runner.run(MyApplicationSession)

全球化:

当你将应用程序发布到全球市场时,你需要确保应用程序可以适应多种语言和文化条件。可以使用Android的本地化功能来实现这一点。

以下是如何使用Android的本地化功能来全球化示例应用程序的步骤:

1. 创建具有默认语言资源的strings.xml文件,该文件应包含应用程序使用的默认文本。

2. 创建其他strings.xml文件,针对特定的地区或语言,以便将文本本地化到该地区或语言。例如,可以创建一个strings.xml文件,其中的文本是适用于法国的。

3. 将资源字符串作为参数传递给setText()等方法,而不是硬编码为常量。

4. 在Android应用程序中,在resources目录下创建一个名为values-fr的文件夹,并在该文件夹中创建一个名为strings.xml的文件。将应用程序的所有资源字符串本地化为法语。

5. 在Android应用程序的Manfiest.xml文件中,添加locales属性,并设置为适用于您想要支持的所有语言的数组。例如,如果您想要支持英语、西班牙语和法语,那么locales属性将如下所示:

<application
????android:name=".MyApplication"
????android:icon="@mipmap/ic_launcher"
????android:label="@string/app_name"
????android:theme="@style/AppTheme"
????android:locales="en, es, fr">

6. 在设备语言设置中更改设备语言,并查看应用程序的文本是否正确显示。

结论:

使用Autobahn Android可以让Android应用程序与服务器之间使用WebSockets进行通信。示例应用程序演示了如何使用Autobahn Android创建一个WebSocket连接,并向服务器发送消息。全球化是一个重要的项目,可以通过Android的本地化功能支持多语言和文化,以最大程度地满足用户的需求。