Swift TCP客户端无法以永久循环方式进行通信

Swift TCP客户端无法以永久循环方式进行通信,swift,tcpclient,Swift,Tcpclient,我想让TCP客户端在永久循环中发送和接收数据。我尝试了以下代码,但数据发送和接收只执行一次 理想的: iOS ------> server iOS <------ server iOS ------> server iOS <------ server and forever ... iOS------>服务器 iOS服务器 iOS服务器 iOS(0){ 变量输出:NSString=NSString(字节:&缓冲区,长度:len!,编码:NSASCIIStringE

我想让TCP客户端在永久循环中发送和接收数据。我尝试了以下代码,但数据发送和接收只执行一次

理想的:

iOS ------> server
iOS <------ server
iOS ------> server
iOS <------ server
  and forever ...
iOS------>服务器
iOS服务器
iOS服务器
iOS(0){
变量输出:NSString=NSString(字节:&缓冲区,长度:len!,编码:NSASCIIStringEncoding)!;
dispatch\u async(dispatch\u get\u main\u queue(){
自处理数据接收(输出);
})
}
}
self.sendFlag=true;
打破
发生NSStreamEvent.Error的情况:
var err=aStream.streamError;
打印(错误?.description);
打破
案例NSStreamEvent.EndEncounted:
aStream.close();
aStream.removeFromRunLoop(NSRunLoop.currentRunLoop(),格式:NSDefaultRunLoopMode);
打破
违约:
NSLog(“未知”)
}
}

当空间可用时,仍在运行读取过程,所以我猜sendFlag仍然为false。
iOS ------> server
iOS <------ server
  one time only
var sendFlag:Bool = true;
func initTcpNetwork(host:String,port :Int,delegate:NSStreamDelegate? ) {

    NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputstream, outputStream: &outputstream)

    inputstream?.delegate=self;
    outputstream?.delegate=self;


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)){
        self.printQueueLabel();
        let loop = NSRunLoop.currentRunLoop();
        self.inputstream?.scheduleInRunLoop(loop, forMode: NSDefaultRunLoopMode);
        self.outputstream?.scheduleInRunLoop(loop, forMode: NSDefaultRunLoopMode);
        self.inputstream?.open()
        self.outputstream?.open()
        loop.run();

    }

}

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {
    switch (eventCode){
    case NSStreamEvent.OpenCompleted:
        NSLog("Stream opened");
        break
    case NSStreamEvent.HasSpaceAvailable:
        NSLog("has space");
        if(sendFlag) {
            sendFlag = false;
            var outputstream = aStream as? NSOutputStream;
            var str = "0";

            var data: NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!;
            outputstream?.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length);
        }

        break
    case NSStreamEvent.HasBytesAvailable:
        var inputstream = aStream as? NSInputStream;

        var buffer = [UInt8](count: 4096, repeatedValue: 0);
        while ((inputstream?.hasBytesAvailable) != nil) {
            var len = inputstream?.read(&buffer, maxLength: 4096);
            if (len > 0) {
                var output: NSString = NSString(bytes:&buffer, length:len!, encoding:NSASCIIStringEncoding)!;
                dispatch_async(dispatch_get_main_queue(), {
                    self.handleDataReceived(output);
                })
            }
        }
        self.sendFlag = true;

        break
    case NSStreamEvent.ErrorOccurred:
        var err = aStream.streamError;
        print(err?.description);

        break
    case NSStreamEvent.EndEncountered:
        aStream.close();
        aStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode);
        break
    default:
        NSLog("unknown.")
    }
}