Swift開發:GCDAsyncSocket通訊之TCP伺服器
1 功能需求:
1 在Swift下使用GCDAsyncSocket實現簡單的資訊收發功能
2 Mac下為tcp伺服器,windows下為tcp客戶端
2 效果圖:
3 swift程式碼:需要匯入GCDAsyncSocket庫檔案,可去github下載
import UIKit
class ViewController:UIViewController,GCDAsyncSocketDelegate {
@IBOutletvar startBtn:UIButton!
@IBOutletvar msgTextView:UITextView!
var
let serverPort:UInt16 =9050
var clientSockets:NSMutableArray!
var startIsSuccessful =false
var mainQueue =dispatch_get_main_queue()
@IBOutletvar inputTextInput:UITextField!
@IBOutletvar sendBtn:UIButton!
overridefunc viewDidLoad() {
super.viewDidLoad
clientSockets =NSMutableArray()
msgTextView.backgroundColor =UIColor.grayColor()
msgTextView.text ="接收的客戶端訊息:\n"
}
// 傳送訊息按鈕
@IBActionfunc sendBtnClick(sender:AnyObject) {
ifclientSockets.count ==0 {
return
}
let msg =inputTextInput.text!
// 1.處理請求,返回資料給客戶端
let serviceStr:NSMutableString =NSMutableString()
serviceStr.appendString(msg)
serviceStr.appendString("\n")
let wSocket =clientSockets[0]//此處只使用一個客戶端連線
wSocket.writeData(serviceStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: 0)
}
//開啟服務按鈕
@IBActionfunc startServer(sender:AnyObject) {
// 1 初始化 我是mac
serverSocket =GCDAsyncSocket()
// 2 設定委託
serverSocket.delegate =self
serverSocket.delegateQueue =dispatch_get_global_queue(0,00)
do {
tryserverSocket.acceptOnPort(serverPort)
startIsSuccessful =true
self.startBtn.enabled =false
print("server start successful!")
}
catch {
startBtn.backgroundColor =UIColor.redColor()
print("server start error!")
}
}
/*
* 有客戶端的socket連線到伺服器
*/
func socket(srvSocket:GCDAsyncSocket!, didAcceptNewSocket cSocket:GCDAsyncSocket!) {
// 1 儲存socket: 判斷socket是否存在,不存在就新增
if cSocket ==nil {
print("client sock nil")
return
}
ifclientSockets.containsObject(cSocket) {
print("已經存在!")
return
}
else {
//不存在,新增
clientSockets.addObject(cSocket)
}
// 2 返回訊息
let serviceStr:NSMutableString =NSMutableString()
serviceStr.appendString("login successful\n")
cSocket.writeData(serviceStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: 0)
// 3.監聽客戶端有沒有資料上傳
//timeout -1 代表不超時
//tag 標識作用,現在不用,就寫0
cSocket.readDataWithTimeout(-1, tag:0)
}
/*
* 讀取客戶端請求的資料
*/
func socket(cSocket:GCDAsyncSocket!, didReadData data:NSData!, withTag tag:Int) {
// 1 獲取客戶的發來的資料 ,把 NSData 轉 NSString
let readClientDataString:NSString? =NSString(data: data, encoding:NSUTF8StringEncoding)
print(readClientDataString!)
// 2 主介面ui 顯示資料
dispatch_async(mainQueue, {
let showStr:NSMutableString =NSMutableString()
showStr.appendString(self.msgTextView.text)
showStr.appendString(readClientDataString!asString)
showStr.appendString("\n")
self.msgTextView.text = showStrasString
})
// 3.處理請求,返回資料給客戶端 ok
let serviceStr:NSMutableString =NSMutableString()
serviceStr.appendString("ok\n")
cSocket.writeData(serviceStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: 0)
// 4每次讀完資料後,都要呼叫一次監聽資料的方法
cSocket.readDataWithTimeout(-1, tag:0)
}
}
xcode 7.1.1