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)
}
}