声明:原文链接(http://www.jianshu.com/p/65ea031ef49b)
* 对作者的文章稍微做了点修改
Socket就是对于传输层TCP/IP的封装
简述:
由于最近项目的需要,需要使用到Socket,所以就趁此整理了一下,网上对于Socket的理论知识有很多,这里就不必多说,此篇文章主要在Swift环境下使用CocoaAsyncSocket库,来实现一个非常简单的Socket连接的例子,帮助大家理解和使用.(大神勿喷呀,哈哈)
1.创建Swift工程,并使用Cocoapods导入CocoaAsyncSocket
1.创建工程
Cocoapods:
use_frameworks!
pod 'CocoaAsyncSocket'
2.搭建服务端和客户端UI
使用Tabbar分别创建服务端界面和客户端界面
服务端和客户端的界面搭建
分别创建服务端和客户端ViewController并关联相关Textfield 和 Button
4.服务端创建Socket绑定端口,设置监听,消息发送等方法
ServerViewController
importUIKit
importCocoaAsyncSocket
classServerViewController:UIViewController{
//端口
@IBOutletweakvarportTF:UITextField!
//消息
@IBOutletweakvarmsgTF:UITextField!
//信息显示
@IBOutletweakvarinfoTV:UITextView!
varserverSocket:GCDAsyncSocket?
varclientSocket:GCDAsyncSocket?
overridefuncviewDidLoad() {
super.viewDidLoad()
addText(text:"显示检测(服务端)")
}
//对InfoTextView添加提示内容
funcaddText(text:String) {
infoTV.text=infoTV.text.appendingFormat("%@\n", text)
}
//监听
@IBActionfunclisteningAct(_sender:Any) {
serverSocket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)
do{
tryserverSocket?.accept(onPort:UInt16(portTF.text!)!)
addText(text:"监听成功")
}catch_{
addText(text:"监听失败")
}
}
//发送
@IBActionfuncsendAct(_sender:Any) {
letdata =msgTF.text?.data(using:String.Encoding.utf8)
//向客户端写入信息Timeout设置为-1则不会超时, tag作为两边一样的标示
clientSocket?.write(data!, withTimeout:-1, tag:0)
}
}
extensionServerViewController:GCDAsyncSocketDelegate{
//当接收到新的Socket连接时执行
funcsocket(_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)
}
funcsocket(_sock:GCDAsyncSocket, didRead data:Data, withTag tag:Int) {
letmessage =String(data: data,encoding:String.Encoding.utf8)
addText(text: message!)
//再次准备读取Data,以此来循环读取Data
sock.readData(withTimeout:-1, tag:0)
}
}
5.客户端创建Socket,设置连接,消息发送,读取,断开连接等方法
ClientViewController
importUIKit
importCocoaAsyncSocket
classClientViewController:UIViewController{
// IP地址
@IBOutletweakvaripTF:UITextField!
//端口
@IBOutletweakvarportTF:UITextField!
//消息
@IBOutletweakvarmsgTF:UITextField!
//消息显示
@IBOutletweakvarinfoTV:UITextView!
varsocket:GCDAsyncSocket?
overridefuncviewDidLoad() {
super.viewDidLoad()
addText(text:"显示检测(客户端)")
}
funcaddText(text:String) {
infoTV.text=infoTV.text.appendingFormat("%@\n", text)
}
//连接
@IBActionfuncconnectionAct(_sender:Any) {
socket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)
do{
trysocket?.connect(toHost: ipTF.text!, onPort:UInt16(portTF.text!)!)
addText(text:"连接成功")
}catch_{
addText(text:"连接失败")
}
}
//断开
@IBActionfuncdisconnectAct(_sender:Any) {
socket?.disconnect()
addText(text:"断开连接")
}
//发送
@IBActionfuncsendMsgAct(_sender:Any) {
socket?.write((msgTF.text?.data(using:String.Encoding.utf8))!, withTimeout:-1, tag:0)
}
}
extensionClientViewController:GCDAsyncSocketDelegate{
funcsocket(_sock:GCDAsyncSocket, didConnectToHost host:String, port:UInt16) {
addText(text:"连接服务器"+host)
self.socket?.readData(withTimeout:-1, tag:0)
}
funcsocket(_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)
}
}
网友评论