
占位圖
文集
iOS開發(fā)之網(wǎng)絡(luò)通信(1)—— 計算機(jī)網(wǎng)絡(luò)
iOS開發(fā)之網(wǎng)絡(luò)通信(2)—— HTTP(S)
iOS開發(fā)之網(wǎng)絡(luò)通信(3)—— XML & JSON
iOS開發(fā)之網(wǎng)絡(luò)通信(4)—— socket
iOS開發(fā)之網(wǎng)絡(luò)通信(5)—— CocoaAsyncSocket
iOS開發(fā)之網(wǎng)絡(luò)通信(6)—— AFNetworking & Alamofire
目錄
- UDP
- TCP Server
- TCP Client
Demo
CocoaAsyncSocket是一個異步socket庫,提供了macOS、iOS和tvOS版本,其底層基于BSD socket。
本文簡單介紹Swift下TCP和UDP用法。
1. UDP
// 創(chuàng)建socket
self.udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: .global())
do {
// 綁定端口
try self.udpSocket?.bind(toPort: UInt16(port))
// 啟用廣播
try self.udpSocket?.enableBroadcast(true)
// 開始接收數(shù)據(jù)
try self.udpSocket?.beginReceiving()
} catch {
// 出錯,關(guān)閉socket
self.udpSocket?.close()
self.udpSocket = nil
print("socket error")
}
// 發(fā)送數(shù)據(jù):可定向發(fā)送(如192.168.1.x)或者廣播(255.255.255.255)
self.udpSocket?.send(messageData, toHost: host, port: port, withTimeout: -1, tag: 0)
//MARK: - GCDAsyncUdpSocketDelegate
// 發(fā)送成功
func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {
DispatchQueue.main.async {
print("send: \(self.messageTF.text!), tag: \(tag)")
self.showMessage("send: \(self.messageTF.text!), tag: \(tag)")
}
}
// 發(fā)送失敗
func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) {
print("didNotSendDataWithTag: \(tag), error: \(String(describing: error))")
showMessage("didNotSendDataWithTag, error: \(String(describing: error))")
}
// 收到數(shù)據(jù)
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
if let dataStr = String.init(data: data, encoding: .utf8) {
print("receive: " + dataStr)
showMessage("receive: " + dataStr)
}
}
2. TCP Server
// 創(chuàng)建socket
func setup() {
self.tcpServer = GCDAsyncSocket(delegate: self, delegateQueue: .global())
self.tcpClients = [GCDAsyncSocket?]()
}
// 監(jiān)聽
func listen(port: UInt16) {
do {
// 檢測有無客戶端連接
try self.tcpServer?.accept(onPort: port)
} catch {
print("accept error")
}
}
// 關(guān)閉
func close() {
// 斷開所有客戶端的連接
guard self.tcpClients != nil,
self.tcpClients!.count > 0 else {
break
}
for tcpClient in self.tcpClients! {
tcpClient?.disconnect()
}
// 斷開服務(wù)端連接
self.tcpServer?.disconnect()
}
// 發(fā)送數(shù)據(jù)
func send(data: Data) {
guard self.tcpClients != nil,
self.tcpClients!.count > 0 else {
return
}
for tcpClient in self.tcpClients! {
tcpClient?.write(data, withTimeout: -1, tag: 0)
}
}
//MARK: - GCDAsyncSocketDelegate
// 檢測到客戶端socket
func socket(_ sock: GCDAsyncSocket, didAcceptNewSocket newSocket: GCDAsyncSocket) {
self.tcpClients?.append(newSocket)
newSocket.readData(withTimeout: -1, tag: 0)
}
// 收到數(shù)據(jù)
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
DispatchQueue.main.async {
if let message = String.init(data: data, encoding: .utf8) {
self.showMessage(message: "receive: " + message)
print("receive: " + message)
}
}
sock.readData(withTimeout: -1, tag: 0)
}
// 發(fā)送成功
func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
DispatchQueue.main.async {
if let message = self.messageTF.text {
self.showMessage(message: "send: " + message)
print("send: " + message)
}
}
}
// 出錯
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
DispatchQueue.main.async {
let message = "error: " + String(describing: err)
self.showMessage(message: message)
print(message)
}
}
3. TCP Client
// 創(chuàng)建socket
func setup() {
self.tcpClient = GCDAsyncSocket(delegate: self, delegateQueue: .global())
}
// 連接
func connect(host: String, port: UInt16) {
do {
try self.tcpClient?.connect(toHost: host, onPort: port)
} catch {
print("connect error")
return
}
}
// 關(guān)閉連接
func disconnect() {
self.tcpClient?.disconnect()
}
// 發(fā)送數(shù)據(jù)
func send(data: Data) {
self.tcpClient?.write(data, withTimeout: -1, tag: 0)
}
//MARK: - GCDAsyncSocketDelegate
// 連接成功
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
sock.readData(withTimeout: -1, tag: 0)
DispatchQueue.main.async {
self.showMessage(message: "connected")
}
}
// 收到數(shù)據(jù)
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
DispatchQueue.main.async {
if let message = String.init(data: data, encoding: .utf8) {
self.showMessage(message: "receive: " + message)
print("receive: " + message)
}
}
sock.readData(withTimeout: -1, tag: 0)
}
// 發(fā)送成功
func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
DispatchQueue.main.async {
if let message = self.messageTF.text {
self.showMessage(message: "send: " + message)
print("send: " + message)
}
}
}
// 出錯
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
DispatchQueue.main.async {
let message = "error: " + String(describing: err)
self.showMessage(message: message)
print(message)
}
}