Socket 就是对于传输层 TCP/IP 的封装
简述:
由于最近项目的需要,需要使用到 Socket,所以就趁此整理了一下,网上对于 Socket 的理论知识有很多,这里就不必多说,此篇文章主要在 Swift 环境下使用 CocoaAsyncSocket 库,来实现一个非常简单的 Socket 连接的例子。
1.创建 Swift 工程,并使用 Cocoapods 导入 CocoaAsyncSocket
1.创建工程
Cocoapods:
use_frameworks!
pod 'CocoaAsyncSocket'
2.搭建服务端和客户端 UI
使用 Tabbar 分别创建服务端界面和客户端界面
3.服务端和客户端的界面搭建
分别创建服务端和客户端 ViewController 并关联相关 Textfield 和 Button
4.服务端创建 Socket 绑定端口,设置监听,消息发送等方法
ServerViewController
5.客户端创建 Socket,设置连接,消息发送,读取,断开连接等方法
ClientViewController
import UIKit
import CocoaAsyncSocket
class ServerViewController:UIViewController{
//端口
@IBOutlet weak var portTF:UITextField!
//消息
@IBOutlet weak var msgTF:UITextField!
//信息显示
@IBOutlet weak var infoTV:UITextView!
var serverSocket:GCDAsyncSocket?
var clientSocket:GCDAsyncSocket?
override func viewDidLoad() {
super.viewDidLoad()
addText(text:"显示检测(服务端)")
}
//对InfoTextView添加提示内容
func addText(text:String) {
infoTV.text=infoTV.text.appendingFormat("%@\n", text)
}
//监听
@IBAction func listeningAct(_sender:Any) {
serverSocket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)
do{
try serverSocket?.accept(onPort:UInt16(portTF.text!)!)
addText(text:"监听成功")
}
catch_{
addText(text:"监听失败")
}
}
//发送
@IBAction func sendAct(_sender:Any) {
let data = msgTF.text?.data(using:String.Encoding.utf8)
//向客户端写入信息Timeout设置为-1则不会超时, tag作为两边一样的标示
clientSocket?.write(data!, withTimeout:-1, tag:0)
}
extension ServerViewController:GCDAsyncSocketDelegate {
//当接收到新的Socket连接时执行
func socket(_sock:GCDAsyncSocket, didAcceptNewSocket newSocket:GCDAsyncSocket) {
addText(text:"连接成功")
addText(text:"连接地址"+ newSocket.connectedHost!)
addText(text:"端口号"+String(newSocket.connectedPort))
clientSocket = newSocket
//第一次开始读取Data
clientSocket!.readData(withTimeout:-1, tag:0)
}
func socket(_sock:GCDAsyncSocket, didRead data:Data, withTag tag:Int) {
let message = String(data: data,encoding:String.Encoding.utf8)
addText(text: message!)
//再次准备读取Data,以此来循环读取Data
sock.readData(withTimeout:-1, tag:0)
}
}
import UIKit
import CocoaAsyncSocket
class ClientViewController:UIViewController{
// IP地址
@IBOutlet weak var ipTF:UITextField!
//端口
@IBOutlet weak var portTF:UITextField!
//消息
@IBOutlet weak var msgTF:UITextField!
//消息显示
@IBOutlet weak var infoTV:UITextView!
var socket:GCDAsyncSocket?
override func viewDidLoad() {
super.viewDidLoad()
addText(text:"显示检测(客户端)")
}
func addText(text:String) {
infoTV.text=infoTV.text.appendingFormat("%@\n", text)
}
//连接
@IBAction func connectionAct(_sender:Any) {
socket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)
do{
try socket?.connect(toHost: ipTF.text!, onPort:UInt16(portTF.text!)!)
addText(text:"连接成功")
}
catch_{
addText(text:"连接失败")
}
}
//断开
@IBAction func disconnectAct(_sender:Any) {
socket?.disconnect()
addText(text:"断开连接")
}
//发送
@IBAction func sendMsgAct(_sender:Any) {
socket?.write((msgTF.text?.data(using:String.Encoding.utf8))!, withTimeout:-1, tag:0)
}
}
extension ClientViewController:GCDAsyncSocketDelegate {
func socket(_sock:GCDAsyncSocket, didConnectToHost host:String, port:UInt16) {
addText(text:"连接服务器"+host)
self.socket?.readData(withTimeout:-1, tag:0)
}
func socket(_sock:GCDAsyncSocket, didRead data:Data, withTag tag:Int) {
letmsg = String(data: dataasData, encoding:String.Encoding.utf8)
addText(text: msg!)
socket?.readData(withTimeout:-1, tag:0)
}
}