1. 程式人生 > >Swift開發:GCDAsyncSocket通訊之TCP伺服器

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

serverSocket:GCDAsyncSocket!

   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.處理請求,返回資料給客戶端

ok

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