Swift TCP客户端无法以永久循环方式进行通信
我想让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
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.")
}
}