前言
一般iOS开发对TCP连接了解不多,平时项目用不到的话,也不会去研究。突然有这方面的需求后,会觉得无从下手。今天我就讲解一下怎么使用CocoaAsyncSocket框架来搭建socket连接的服务器端。
服务器端的使用跟客户端还是有区别的,所以这篇文章也要细看(点我查看客户端配置)。
CocoaAsyncSocket框架是方便iOS开发者在开发时建立TCP/UDP连接的框架,在github有将近10k的star。一般开发时都会用这个框架。
我已经写了SocketServerDemo上传到github上了。本文中的代码也来自这个demo,star不重要,开心最重要。哈哈。
安装CocoaAsyncSocket
CocoaAsyncSocket在github上已经介绍了安装方法,Objective-C和Swift都可以使用。我使用的是CocoaPods的方式。(不会用CocoaPods?点我查看使用方法)
初始化
- 引入框架
import CocoaAsyncSocket
- 定义socket成员变量,这里要定义两个,一个服务器socket,一个客户端socket。
var serverSocket: GCDAsyncSocket! // 服务器socket
var clientSocket: GCDAsyncSocket! // 客户端socket
- 初始化serverSocket
在viewDidLoad方法中进行初始化工作
serverSocket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
注:clientSocket不需要初始化,它是在与客户端连接成功后的回调中获得的。下面会有介绍。
开始监听
在界面上输入端口号后,即可开始监听。(端口号是让客户端连接时使用的,详细例子可查看我写的demo)
func startReceive() {
view.endEditing(true)
let ports = portField.text ?? ""
guard let port = UInt16(ports) else {
showMessage("端口号有问题")
return
}
do {
try serverSocket.accept(onPort: port)
showMessage("正在监听...")
} catch {
showMessage("启动失败")
}
}
停止监听
停止监听时,调用disconnect方法。代码如下:
func stopListen() {
serverSocket.disconnect()
showMessage("停止监听")
}
发消息
连接成功后,即可给客户端发送消息。示例代码如下:
@objc func sendMessage() {
view.endEditing(true)
let data = messageField.text?.data(using: .utf8)
clientSocket.write(data!, withTimeout: -1, tag: 0)
}
接收消息
连接成功后,可以接收到客户端发送的消息。示例代码如下:
func receiveMessage() {
view.endEditing(true)
clientSocket.readData(withTimeout: 11, tag: 0)
}
回调-连接成功
与客户端连接成功之后,可以在连接成功的回调方法中获得客户端的socket对象,并赋值给clientSocket变量,表明当前连接的客户端。示例代码如下:
func socket(_ sock: GCDAsyncSocket, didAcceptNewSocket newSocket: GCDAsyncSocket) {
// 客户端的socket
clientSocket = newSocket
showMessage("连接成功")
let address = "服务器地址:" + "\(newSocket.connectedHost ?? " ")" + " -端口:" + "\(newSocket.connectedPort)"
showMessage(address)
clientSocket.readData(withTimeout: -1, tag: 0)
}
回调-接收到消息
接收到客户端发来的消息后,可以在接收消息的回调方法中进行处理。示例代码如下:
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
let text = String(data: data, encoding: .utf8)
showMessage(text!)
clientSocket.readData(withTimeout: -1, tag: 0)
}
回调-断开连接
当连接断开时,可以在断开连接的回调方法中断开客户端的连接。示例代码如下:
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
showMessage("服务器端-已断开连接")
clientSocket.disconnect()
}
效果
可运行demo查看效果。