+1

Websocket trên ứng dụng iOS sử dụng SocketRocket

Websocket là gì

Websocket là giao thức mạng cho phép duy trì kết nối hai chiều giữa client và web server. Websocket rất hữu dụng cho các ứng dụng di động, cho phép các ứng dụng này tái sử dụng lại các công cụ, API được xây dựng cho ứng dụng web, như việc chúng ta tái sử dụng các API trên giao thức HTTP.

Lợi ích khi sử dụng websocket

Sử dụng Websocket mang lại một số ưu điểm so với sử dụng raw TCP socket:

  • Tái sử dụng lại hạ tầng sẵn có trên giao thức HTTP/1.1 như routing, reverse proxying, xác thực...
  • Tái sử dụng server logic được xây dựng để giao tiếp với ứng dụng web trên trình duyệt
  • Không phải tự xây dựng framing protocol cho ứng dụng.

Thư viện SocketRocket

Mô tả

SocketRocket là thư viện Websocket (RFC6455) client cho iOS, macOS, tvOS sử dụng ngôn ngữ Objective-C.

  • Hỗ trợ TLS (wss).
  • Hỗ trợ HTTP Proxy
  • Hỗ trợ IPv4/IPv6
  • Hỗ trợ chứng thực SSL.
  • Gửi ping và có thể xử lý sự kiện pong.
  • Xử lý theo cơ chế bất đồng bộ và non-blocking.
  • Hỗ trợ iOS, macOS, tvOS.

Cài đặt SocketRocket.

  • Sử dụng CocoaPods, thêm dòng dưới đây vào cấu hình CocoaPods pod 'SocketRocket'
  • Sử dụng Carthage, thêm dòng dưới đây vào cấu hình Cathage github "facebook/SocketRocket"

Sử dụng thư viện SocketRocket

Thư viện SocketRocket sử dụng lớp SRWebSocket cho các xử lý với websocket SRWebSocket sẽ tự quản lý đối tượng từ khi gọi hàm -(void)open cho tới khi phát sinh các sự kiện như đóng kết nối.

Các hàm API

@interface SRWebSocket : NSObject

// Khởi tạo Websocket bằng hàm này
- (instancetype)initWithURLRequest:(NSURLRequest *)request;

// Thiết lập delegate xử lý các sự kiện socket trước khi mở kết nối
@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;

// Sử dụng hàm này để mở kết nối
- (void)open;

// Sử dụng hàm này để đóng kết nối
- (void)close;

// Sử dụng hàm này để gửi dữ liệu
- (void)sendData:(nullable NSData *)data error:(NSError **)error;

// Sử dụng hàm này để gửi dữ liệu dạng UTF8 String
- (void)sendString:(NSString *)string error:(NSError **)error;

@end

Các xử lý sự kiện WebSocket

@protocol SRWebSocketDelegate <NSObject>

@optional

- (void)webSocketDidOpen:(SRWebSocket *)webSocket;

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithString:(NSString *)string;
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithData:(NSData *)data;

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(nullable NSString *)reason wasClean:(BOOL)wasClean;

@end

Chương trình Demo

Để demo sử dụng thư viện SocketRocket, mình có viết một ứng dụng Chat Server-Client đơn giản.

  • Server viết bằng ngôn ngữ python sử dụng thư viện tornado

    • Cài đặt: Cần cài đặt thêm thư viên python tornado bằng cách chạy lệnh $pip install tornado
    • Sử dụng: Chạy lệnh dưới đây để khởi động server chat python chatroom.py Sau khi chạy xong, ứng dụng chat server sẽ mở dịch vụ mặc định tại cổng 9000, truy cập vào địa chỉ http://server_ip:9000 để kết nối server bằng trình duyệt
  • Client là một ứng dụng iOS

    • Cài đặt: Do SocketRocket là thư viện Objective-C, nên cần thêm một file Bridging-Header để có thể sử dụng trong Swift, có nội dụng như sau: #import <SocketRocket/SocketRocket.h>

      Đối với server ví dụ ở trên, ứng dụng client sẽ kết nối tới URL dịch vụ có dạng như sau: http://server_ip:9000/chat

  • Một số hình ảnh của ứng dụng:

Nguồn tham khảo và source code chương trình

Nguồn tham khảo: https://github.com/facebook/SocketRocket Source code demo: https://github.com/oLeThiVanAnh/R6_2017


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.