Swift开发:GCDAsyncSocket通信之TCP服务器

前端之家收集整理的这篇文章主要介绍了Swift开发:GCDAsyncSocket通信之TCP服务器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1 功能需求:@H_502_4@

1 在Swift下使用GCDAsyncSocket@H_502_4@实现简单的信息收发功能@H_502_4@@H_502_4@

2 Mac下为tcp服务器@H_502_4@,windows下为tcp客户端@H_502_4@@H_502_4@@H_502_4@

2 效果图:@H_502_4@@H_502_4@

@H_502_4@@H_502_4@@H_502_4@


@H_502_4@


@H_502_4@

3 swift代码:需要导入GCDAsyncSocket库文件,可去github下载@H_502_4@@H_502_4@

@H_502_4@@H_502_4@

import@H_502_4@ UIKit


class@H_502_4@ ViewController:@H_502_4@UIViewController@H_502_4@,@H_502_4@GCDAsyncSocketDelegate {@H_502_4@


@IBOutlet@H_502_4@ var@H_502_4@ startBtn:UIButton@H_502_4@!

@IBOutlet@H_502_4@ var@H_502_4@ msgTextView:UITextView@H_502_4@!

var@H_502_4@ serverSocket: GCDAsyncSocket@H_502_4@!

let@H_502_4@ serverPort: UInt16@H_502_4@ =9050@H_502_4@

var@H_502_4@ clientSockets: NSMutableArray@H_502_4@!

var@H_502_4@ startIsSuccessful = false@H_502_4@

@H_502_4@var@H_502_4@ mainQueue =@H_502_4@dispatch_get_main_queue()@H_502_4@

@IBOutlet@H_502_4@ var@H_502_4@ inputTextInput:UITextField@H_502_4@!

@IBOutlet@H_502_4@ var@H_502_4@ sendBtn:UIButton@H_502_4@!

override@H_502_4@ func@H_502_4@ viewDidLoad() {

super@H_502_4@.viewDidLoad@H_502_4@()

@H_502_4@clientSockets@H_502_4@ =@H_502_4@NSMutableArray()@H_502_4@

msgTextView@H_502_4@.backgroundColor@H_502_4@ =UIColor@H_502_4@.grayColor@H_502_4@()

@H_502_4@msgTextView@H_502_4@.@H_502_4@text@H_502_4@ =@H_502_4@"接收的客户端消息:@H_502_4@\n"

}

@H_502_4@// 发送消息按钮@H_502_4@

@IBAction@H_502_4@ func@H_502_4@ sendBtnClick(sender:AnyObject@H_502_4@) {

if@H_502_4@ clientSockets@H_502_4@.count@H_502_4@ ==0@H_502_4@ {

return@H_502_4@

}

let@H_502_4@ msg = inputTextInput@H_502_4@.text@H_502_4@!

@H_502_4@// 1.处理请求,返回数据给客户端@H_502_4@ ok

@H_502_4@let@H_502_4@ serviceStr:@H_502_4@NSMutableString = @H_502_4@NSMutableString()@H_502_4@

serviceStr.appendString@H_502_4@(msg)

serviceStr.appendString@H_502_4@("\n"@H_502_4@)

let@H_502_4@ wSocket = clientSockets@H_502_4@[0@H_502_4@]// @H_502_4@此处只使用一个客户端连接@H_502_4@

wSocket.writeData(serviceStr.dataUsingEncoding@H_502_4@(NSUTF8StringEncoding@H_502_4@),withTimeout: -1@H_502_4@,tag: 0@H_502_4@)

}

@H_502_4@//开启服务按钮@H_502_4@

@IBAction@H_502_4@ func@H_502_4@ startServer(sender:AnyObject@H_502_4@) {

@H_502_4@// 1 初始化@H_502_4@ 我是@H_502_4@mac

@H_502_4@serverSocket@H_502_4@ =@H_502_4@GCDAsyncSocket()@H_502_4@

@H_502_4@// 2 设置委托@H_502_4@

@H_502_4@serverSocket.@H_502_4@delegate =@H_502_4@self@H_502_4@

@H_502_4@serverSocket.@H_502_4@delegateQueue =@H_502_4@dispatch_get_global_queue@H_502_4@(@H_502_4@0@H_502_4@,@H_502_4@00@H_502_4@)@H_502_4@

do@H_502_4@ {

@H_502_4@try@H_502_4@@H_502_4@serverSocket.@H_502_4@acceptOnPort@H_502_4@(@H_502_4@serverPort)@H_502_4@

@H_502_4@startIsSuccessful =@H_502_4@true@H_502_4@

self@H_502_4@.startBtn@H_502_4@.enabled@H_502_4@ =false@H_502_4@

@H_502_4@print@H_502_4@(@H_502_4@"server start successful!")@H_502_4@

}

catch@H_502_4@ {

startBtn@H_502_4@.backgroundColor@H_502_4@ =UIColor@H_502_4@.redColor@H_502_4@()

@H_502_4@print@H_502_4@(@H_502_4@"server start error!")@H_502_4@

}

}

/*@H_502_4@

* 有客户端的@H_502_4@socket连接到服务器@H_502_4@

*/

func@H_502_4@ socket(srvSocket: GCDAsyncSocket@H_502_4@!,didAcceptNewSocket cSocket: GCDAsyncSocket@H_502_4@!) {

@H_502_4@// 1 保存@H_502_4@socket:@H_502_4@ 判断@H_502_4@socket是否存在,不存在就添加@H_502_4@

if@H_502_4@ cSocket == nil@H_502_4@ {

@H_502_4@print@H_502_4@(@H_502_4@"client sock nil")@H_502_4@

return@H_502_4@

}

if@H_502_4@ clientSockets@H_502_4@.containsObject@H_502_4@(cSocket) {

print@H_502_4@("@H_502_4@已经存在!@H_502_4@"@H_502_4@)

return@H_502_4@

}

else@H_502_4@ {

// @H_502_4@不存在,添加@H_502_4@

clientSockets@H_502_4@.addObject@H_502_4@(cSocket)

}

@H_502_4@// 2 返回消息@H_502_4@

@H_502_4@let@H_502_4@ serviceStr:@H_502_4@NSMutableString = @H_502_4@NSMutableString()@H_502_4@

serviceStr.appendString@H_502_4@("login successful\n"@H_502_4@)

cSocket.writeData@H_502_4@(serviceStr.dataUsingEncoding@H_502_4@(NSUTF8StringEncoding@H_502_4@),tag: 0@H_502_4@)

@H_502_4@// 3.监听客户端有没有数据上传@H_502_4@

@H_502_4@//timeout -1 代表不超时@H_502_4@

@H_502_4@//tag 标识作用,现在不用,就写@H_502_4@0

cSocket.readDataWithTimeout@H_502_4@(-1@H_502_4@,tag:0@H_502_4@)

}

/*@H_502_4@

* @H_502_4@读取客户端请求的数据

*/

func@H_502_4@ socket(cSocket: GCDAsyncSocket@H_502_4@!,didReadData data: NSData@H_502_4@!,withTag tag:Int@H_502_4@) {

@H_502_4@// 1 获取客户的发来的数据@H_502_4@ ,把@H_502_4@ NSData 转@H_502_4@ NSString

let@H_502_4@ readClientDataString: NSString@H_502_4@? = NSString@H_502_4@(data: data,encoding:NSUTF8StringEncoding@H_502_4@)

print@H_502_4@(readClientDataString!)

@H_502_4@// 2 主界面@H_502_4@ui 显示数据@H_502_4@

@H_502_4@dispatch_async(@H_502_4@mainQueue@H_502_4@,{@H_502_4@

@H_502_4@let@H_502_4@ showStr:@H_502_4@NSMutableString = @H_502_4@NSMutableString()@H_502_4@

showStr.appendString@H_502_4@(self@H_502_4@.msgTextView@H_502_4@.text@H_502_4@)

showStr.appendString@H_502_4@(readClientDataString!as@H_502_4@ String@H_502_4@)

showStr.appendString@H_502_4@("\n"@H_502_4@)

self@H_502_4@.msgTextView@H_502_4@.text@H_502_4@ = showStras@H_502_4@ String@H_502_4@

})

@H_502_4@// 3.处理请求,返回数据给客户端@H_502_4@ ok

@H_502_4@let@H_502_4@ serviceStr:@H_502_4@NSMutableString = @H_502_4@NSMutableString()@H_502_4@

serviceStr.appendString@H_502_4@("ok\n"@H_502_4@)

cSocket.writeData@H_502_4@(serviceStr.dataUsingEncoding@H_502_4@(NSUTF8StringEncoding@H_502_4@),tag: 0@H_502_4@)

@H_502_4@// 4@H_502_4@每次读完数据后,都要调用一次监听数据的方法

cSocket.readDataWithTimeout@H_502_4@(-1@H_502_4@,tag:0@H_502_4@)

}

}

猜你在找的Swift相关文章