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@
@H_502_4@
@H_502_4@
3 swift代码:需要导入GCDAsyncSocket库文件,可去github下载@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"
}
@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@)
}
@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@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@ {
clientSockets@H_502_4@.addObject@H_502_4@(cSocket)
}
@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@)
}
}