fb-script

2015年10月21日 星期三

iOS swift 2 使用 CocoaAsyncSocket 建立 TCP byte array 通訊

AsyncSocket 下載位置
因為專案是 swift 專案,要使用 objecitive-c 的函式庫要在 Header 檔中 import

1.複製AsyncSocket.mAsyncSocket.h 到專案中,xcode 會問你是否建立 Bridge file,確定建立
2.在 你的專案名稱-Bridging-Header.h檔中加入#import "AsyncSocket.h"
3.建立連線物件var socket: AsyncSocket = AsyncSocket(delegate: 委派對象)

var socket: AsyncSocket!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    socket = AsyncSocket(delegate: self)

    do {
        try socket.connectToHost("xxx.xxx.xxx.xxx", onPort: xxxx)
    }catch let error as NSError {
        print(error)
    }
}

4.委派物件實作 AsyncSocketDelegate 協定,此協定中所有 callback 都是 optional 的,
這邊紀錄『連線』、『收』、『送』、『斷線』事件

連線

func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) {
    let bytearr:[UInt8] = [1,2,3]
    let data: NSData = NSData(bytes: bytearr, length: bytearr.count)
    socket.writeData(data, withTimeout: 0, tag: 0)
    socket.readDataWithTimeout(10, tag: 0)
}

這邊內容是一旦連線就送一個 [1, 2, 3] 的陣列過去,並且監聽一個 10 秒 timeout 的回傳事件

func onSocket(sock: AsyncSocket!, didReadData data: NSData!, withTag tag: Int) {
    print("read\(data.getByteArray())")
    socket.readDataWithTimeout(10, tag: 0)
}

收到以後再次監聽是否還有 data 回傳

let bytearr:[UInt8] = [1,2,3]
let data: NSData = NSData(bytes: bytearr, length: bytearr.count)
socket.writeData(data, withTimeout: 0, tag: 0)

斷線

func onSocketDidDisconnect(sock: AsyncSocket!) {
    print("disconnect")

}

func onSocket(sock: AsyncSocket!, willDisconnectWithError err: NSError!) {
    print("will disconnect with error:\(err)")
    socket.disconnect()
}

特別要注意的是收的部分,叫他收一次他就收一次,所以如果要持續監聽在收到一個以後就要再次呼叫收,不然就不收了

GitHub Demo 專案

沒有留言:

張貼留言