Thực hành tốt nhất của Socket.io với Android

Socket.IO cho phép giao tiếp dựa trên sự kiện hai chiều thời gian thực. Nó hoạt động trên mọi nền tảng, trình duyệt hoặc thiết bị, tập trung như nhau vào độ tin cậy và tốc độ. Socket.IO được xây dựng dựa trên API WebSockets (phía Máy khách) và NodeJs.

Socket.IO không phải là thư viện WebSocket với các tùy chọn dự phòng cho các giao thức thời gian thực khác. Nó là một triển khai giao thức thời gian thực tùy chỉnh trên các giao thức thời gian thực khác. Các phần đàm phán giao thức của nó khiến máy khách hỗ trợ WebSocket tiêu chuẩn không thể liên lạc với máy chủ Socket.IO.
Và một máy khách triển khai Socket.IO không thể nói chuyện với một máy chủ WebSocket không dựa trên Socket.IO hoặc Long Polling Comet. Do đó, Socket.IO yêu cầu sử dụng các thư viện Socket.IO ở cả phía máy khách và máy chủ.

Trang web chính thức nói rằng,

Socket.IO cho phép giao tiếp dựa trên sự kiện hai chiều thời gian thực.

Socket.IO cho phép máy khách và máy chủ liên lạc trong thời gian thực. Máy chủ Socket.IO NodeJs xác định các sự kiện sẽ được kích hoạt trên một tuyến cụ thể. Các sự kiện này được lắng nghe bởi máy chủ được phát ra bởi các máy khách. Ngoài ra, một máy chủ có thể phát ra một sự kiện mà khách hàng có thể nghe.

Socket.IO có thể dễ dàng được triển khai trên các ứng dụng web bằng máy chủ NodeJs làm back-end. Nhưng trong trường hợp của Android?

Sau đó, chúng tôi có một thư viện tốt nhất được tạo bởi Naoyuki Kanezawa [@nkwaza].
và một bởi chính thức của Socket.IO Github cho Android với tư cách là khách hàng của máy chủ Socket.IO.

Nó phụ thuộc vào bạn những gì bạn muốn chọn là sở thích cá nhân của bạn.
0] Ổ cắm. Máy khách Android-Java

1] Thư viện ứng dụng khách Nkwaza Android Socket.IO

bạn có thể sử dụng một trong hai Tôi muốn giới thiệu cho bạn cái thứ hai vì nó rất tiện dụng và dễ sử dụng.
Bạn có thể đi qua blog chính thức trên trang web Socket.IO của NKwaza.

Để triển khai thư viện android Socket.IO theo cách hoàn hảo và hoàn hảo, bạn nên đọc thêm.
Có ba bước để triển khai thư viện Máy khách Android SOcket.IO.

0. Khởi tạo ổ cắm
1. Kết nối ổ cắm với máy chủ
2. Bắt đầu phát ra sự kiện hoặc nghe sự kiện

Nhiều khi chúng ta sử dụng Socket.IO, các vấn đề thường gặp phải là

1-Khởi tạo không chính xác và nó cung cấp cho NullPulumExecption.

2- Không thể phát và nghe sự kiện thích hợp vì ổ cắm không được kết nối.

Để tránh điều này hãy thử cách tiếp cận sau đây.

Bước đầu tiên Thêm phụ thuộc sau vào tệp build.gradle cấp ứng dụng của bạn

triển khai ‘com.github.nkzawa: socket.io-client: 0.5.2 '

# 0. Khởi tạo ổ cắm

Để xác định ổ cắm, hãy tạo một lớp của bạn để mở rộng lớp Application.

Xem đoạn mã dưới đây

nhập android.app.Ứng dụng;
nhập com.github.nkzawa.socketio.client.IO;
nhập com.github.nkzawa.socketio.client.Socket;
nhập java.net.URISyntaxException;
lớp công khai RatKiller mở rộng Ứng dụng {
    ổ cắm riêng mSocket;
    URL chuỗi cuối cùng tĩnh riêng tư = "http://yoururl.com";
    @Ghi đè
    khoảng trống công khai onCreate () {
        super.onCreate ();
        thử {
            mSocket = IO.socket (URL);
        } bắt (URISyntaxException e) {
            ném RuntimeException mới (e);
        }
    }
   ổ cắm công cộng getmSocket () {
     trả lại mSocket;
   }
}

Ở đây trong lớp ứng dụng, khai báo một socket biến riêng mà chúng ta sẽ sử dụng làm tài liệu tham khảo mà bạn biết.
Phương thức trợ giúp getmSocket () sẽ trả về thể hiện của socket mà chúng ta có thể sử dụng trong toàn bộ dự án của mình.

# 1.Kết nối ổ cắm

Để kết nối ổ cắm với máy chủ, chúng ta cần sử dụng phương thức connect () trên thể hiện của socket được trả về từ phương thức getmSocket ().
Trong MainActivity của bạn hoặc bất kỳ hoạt động nào, hãy thêm đoạn mã sau vào phương thức onCreate ().

lớp công khai MainActivity mở rộng AppCompatActivity {
ổ cắm riêng mSocket;
@Ghi đè
được bảo vệ void onCreate (Gói đã lưuInstanceState) {
    super.onCreate (yetInstanceState);
    setContentView (R.layout.activity_main);
Ứng dụng RatKiller = (RatKiller) getApplication ();
    mSocket = app.getmSocket ();
    //
    //
    // ...
}

Để kiểm tra xem kết nối có được thiết lập hay không, bạn có thể kiểm tra bằng cách sử dụng phương thức được kết nối ().

if (mSocket.connected ()) {
  Toast.makeText (MainActivity.this, "Đã kết nối !!", Toast.LENGTH_SHORT) .show ();
 }

# 2. Nghe hoặc phát ra sự kiện

Để phát ra sự kiện, bạn có thể sử dụng phương thức emit (). Emit () kích hoạt một sự kiện trên máy chủ mà bạn sẽ thực hiện dưới dạng một nút bấm hoặc bất kỳ phản hồi hành động nào.

button.setOnCLickListener (view-> mSocket.emit (Cách giết chết, toxObject));

Để nghe các sự kiện cụ thể được gửi bởi máy chủ, chúng tôi sử dụng phương thức on (). Phương thức on () mở một kênh được cung cấp và nhận phản hồi từ máy chủ.

mSocket.on ("rat_data", Emitter.Listener () {
    @Ghi đè
    cuộc gọi void công khai (Object ... args) {
        Dữ liệu JSONObject = (JSONObject) args [0];
// ở đây dữ liệu ở định dạng JSON
        //Toast.makeText(MainActivity.this, data.toString (), Toast.LENGTH_SHORT) .show ();
}
});

Đôi khi bạn cần lắng nghe phản hồi của một số sự kiện mà ứng dụng khách / ứng dụng sẽ kích hoạt thông qua nhấp chuột vào nút hoặc bất kỳ hành động nào được kích hoạt, v.v.
Trong các trường hợp như vậy, chúng ta có thể gọi phương thức on () trên phương thức emit (). Phương thức emit () sẽ kích hoạt một số sự kiện trên tuyến / kênh cụ thể và on () sẽ ngay lập tức lắng nghe phản hồi được gửi bởi máy chủ.
Bạn có thể đạt được điều này bằng cách làm một cái gì đó như

mSocket.emit ("get_rat_data"). trên ("rat_data", Emitter.Listener () {mới
    @Ghi đè
    cuộc gọi void công khai (Object ... args) {
        Dữ liệu JSONObject = (JSONObject) args [0];
// dữ liệu ở định dạng JSOn
}
});

Dữ liệu / Tải trọng theo yêu cầu

Tải trọng yêu cầu hoặc dữ liệu thân yêu cầu phải được gửi ở định dạng JSON đến ổ cắm. Đối tượng JSON là tham số đầu vào của phương thức emit (). Lớp JavaO JSONObject và JSONArray giúp chúng ta xây dựng một định dạng cơ thể JSON của dữ liệu.
Bạn có thể làm điều này như

JSONArray toxArray = new JSONArray ();
độcArray.put (1);
độcArray.put (2);
JSONObject toxObject = new JSONObject ();
thử {
    
    toxObject.put ("thuốc độc", toxArray);
} bắt (JSONException e) {
    e.printStackTrace ();
}

Triển khai giao diện người dùng

Mỗi khi bạn nhận được dữ liệu dưới dạng phản hồi từ máy chủ, bạn cần cập nhật giao diện người dùng của mình. Để cập nhật UI bằng dữ liệu nhận được, chúng ta cần thực hiện tất cả logic liên kết UI trên phương thức runOnUiThread ().

Phương thức gọi () từ Emmiter.Listener {Lành} được sử dụng để làm việc trên một luồng nền. Nếu bạn cố gắng gọi phương thức cụ thể của UI bên trong cuộc gọi, nó sẽ nổ tung bằng cách làm nổ tung Ngoại lệ Thời gian chạy yêu thích của chúng tôi.
Bạn có thể đạt được điều này bằng cách gọi một phương thức runOnUiThread (Runnable r).

mSocket.emit ("kill", toxObject) .on ("rat_data", Emitter.Listener () {
    @Ghi đè
    cuộc gọi void công khai (Object ... args) {
     Dữ liệu JSONObject = (JSONObject) args [0];
// dữ liệu ở định dạng JSOn
     runOnUiThread (mới Runnable () {
         @Ghi đè
         công khai void run () {
           Toast.makeText (MainActivity.this, "Haha !! Tất cả chuột bị giết!", Toast.LENGTH_SHORT) .show ();
          ratTextView.setText ("0");
          // bất cứ logic UI nào của bạn
         }
     });
    }
});

Và thực hiện vấn đề được giải quyết ngay bây giờ. Vâng, tôi biết! Tôi sẽ giết những con chuột chạy khắp nơi trên sàn nhà.