socket服务端(GCDAsyncSocket)

main.swift

//
//  main.swift
//  socket服务器
//
//  Created by admin on 16/3/16.
//  Copyright © 2016年 jin. All rights reserved.
//

import Foundation
let server = Server()
server.start(52013)
NSRunLoop.currentRunLoop().run()

Server.swift

//
//  Server.swift
//  socket服务器
//
//  Created by admin on 16/3/16.
//  Copyright © 2016年 jin. All rights reserved.
//


class Server: NSObject,GCDAsyncSocketDelegate {
    var serverSocket:GCDAsyncSocket?
    var clientSockets:[GCDAsyncSocket] = []
    override init()
    {
        super.init()
        self.serverSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0))
    }
    // 开启服务器
    func start(port:UInt16)
    {
        let res = try? self.serverSocket?.acceptOnPort(port)
        if res != nil
        {
            print("ok")
        }
        else
        {
            print("error")
        }
    }
    // 当有新的客户端时会调用这个方法,注意要把客户端socket保存起来,不然客户端连上立马就退出了
    func socket(sock: GCDAsyncSocket!, didAcceptNewSocket newSocket: GCDAsyncSocket!) {
        // 保存起来
        self.clientSockets.append(newSocket)
        // 客户端先读取下数据,不然无法服务器无法接受客户端的数据
        newSocket.readDataWithTimeout(-1, buffer: nil, bufferOffset: 0, tag: self.clientSockets.count)
    }
    // 接受客户端的数据,当客户端又数据的时候会调用这个方法
    func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) {
        // 转换二进制数据
        var str = NSString(data: data, encoding: NSUTF8StringEncoding)
        // 去掉换行和回车
        str = str?.stringByReplacingOccurrencesOfString("\n", withString: "")
        str = str?.stringByReplacingOccurrencesOfString("\r", withString: "")
        // 把字符串按照 : 符号分隔成数组
        let strArr = str?.componentsSeparatedByString(":")
        // 初始化返回值字符串
        var outputStr:NSString = "不能识别"
        // 对不同类型的消息进行处理
        if strArr?.count > 1
        {
            switch(strArr![0])
            {
            case "message":
                outputStr = "\(strArr![0])说\(strArr![1])"
                break
            case "login":
                outputStr = "\(strArr![1])登录成功"
                break
            default:
                break
            }
        }
        if strArr![0] == "quit"
        {
            // 关闭连接
            sock.disconnect()
            // 从socket数组中移除
            self.clientSockets.removeAtIndex(self.clientSockets.indexOf(sock)!)
        }
        outputStr = "\(outputStr)\n"
        // 往客户端写入数据
        sock.writeData(outputStr.dataUsingEncoding(NSUTF8StringEncoding), withTimeout: -1, tag: tag)
    }
    // 在服务器写数据的时候会调用,这里必须实现并且read下数据,不然上面的方法就只能执行一次
    func socket(sock: GCDAsyncSocket!, didWriteDataWithTag tag: Int) {
        sock.readDataWithTimeout(-1, tag: tag)
    }
}

标签: swift

添加新评论