12/08/2018, 17:42

[IOS] Xây dựng ứng dụng realtime với NodeJs và SocketIO (Phần 2)

Ở phần 1, mình đã hướng dẫn các bạn về cách cài đặt môi trường và tạo kết nối, phần này chúng ta sẽ viết 1 ứng dụng nhỏ áp dụng nodeJs và SocketIO 1. Thiêt lập phía Server Tạo kết nối ban đầu phía server var express = require('express') var app = express() var server = ...

Ở phần 1, mình đã hướng dẫn các bạn về cách cài đặt môi trường và tạo kết nối, phần này chúng ta sẽ viết 1 ứng dụng nhỏ áp dụng nodeJs và SocketIO

1. Thiêt lập phía Server

Tạo kết nối ban đầu phía server

var express = require('express')
var app = express()
var server = require('http').Server(app)
var io = require('socket.io')(server)
  • Đăng ký các kết nối qua cơ chế emit (phát tín hiệu) và on (Lắng nghe)
  • Ở đây mình đăng ký lắng nghe qua cổng 8080
server.listen( 8080, function() {
  io.on('connection', function (socket) {
    console.log("Connected");
    socket.on('viewPoint', function(data) {
      io.sockets.emit('viewPointReceive', data)
    })
  })
})
  • Qua cổng 8080, server sẽ lắng nghe (on)toạ độ của của hình tròn qua hàm "viewPoint" với bộ dữ liệu là "data"
  • Sau đó phát (emit) đến tất cả các client đã cài đặt app qua hàm "viewPointReceive" với bộ dữ liệu là "data"

Chú ý

  • io.sockets.emit: phát tín hiệu đến tất cả các client
  • socket.emit: chỉ phát đến 1 client nào đó nhất định

2. Thiết lập phía client

Tạo 1 view đơn giản với 1 hình màu đỏ bên trong

Khai báo Socket:

 let socketManager = SocketManager(socketURL: URL.init(string: "http://localhost:2018")!,
                                config: [.log(true), .compress])
 var socket: SocketIOClient?

Mỗi lần di chuyển hình vuông, ta gửi (emit) toạ độ của hình vuông lên server qua Socket.emit

@IBAction func panRedView(_ sender: UIPanGestureRecognizer) {
        let point = sender.translation(in: redView)
        socket?.emit("viewPoint", with: [[point.x,point.y]])
    }

Trong viewDidLoad, client sẽ lắng nghe (on) toạ độ của hình vuông rồi di chuyển theo toạ độ phía server gửi về trong hàm "viewPointRecieve"

socket = socketManager.defaultSocket
socket?.connect() 
socket?.on("viewPointReceive", callback: { (data, ack) in
      if let points = data[0] as? NSArray,
           let x = points[0] as? CGFloat,
           let y = points[1] as? CGFloat {
           self.redView.layer.transform = CATransform3DTranslate(CATransform3DIdentity, x, y, 0)
      }
 })

4 Kết quả

  • Khi 1 client di chuyển vị trí hình vuông, hình vuông ở tất cả các client khác cũng sẽ di chuyển theo

  • HI vọng với NodeJs và SocketIo chúng ta có thể làm được nhiều ứng dụng realtime khác hay ho hơn ví dụ như appChat, liveStream, game online ....
0