我创建了一个小应用程序,应该将NSString发送到我的服务器。我在那里运行了一个应用程序,它监听一个extact端口,就像一个垃圾站:它保存了从那里进来的所有数据。
我创建的iPhone应用程序使用了这个:
-(IBAction)pressButton:(id)sender {
NSString *iHostname = [NSString stringWithFormat:@"xxx.xxx.xxx.xxx"];
NSString *iPort = [NSString stringWithFormat:@"9100"];
CFWriteStreamRef writeStream;
static const CFOptionFlags kWriteNetworkEvents = kCFStreamEventEndEncountered |
kCFStreamEventErrorOccurred |
kCFStreamEventCanAcceptBytes |
kCFStreamEventOpenCompleted |
kCFStreamEventNone;
CFStreamClientContext ctxt = {0,(void*)NULL,NULL,NULL,NULL};
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault,(CFStringRef)iHostname);
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, hostRef, [iPort intValue],
NULL, &writeStream);
CFWriteStreamSetClient(writeStream, kWriteNetworkEvents, WriteStreamClientCallBack, &ctxt);
CFWriteStreamScheduleWithRunLoop(writeStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
所以,我称之为runloop方法:
static void WriteStreamClientCallBack( CFWriteStreamRef stream, CFStreamEventType type, void *clientCallBackInfo ) {
NSLog(@"%lu", type);
switch (type)
{
case kCFStreamEventEndEncountered:
{
NSLog(@"Closing");
CFWriteStreamClose(stream);
break;
}
case kCFStreamEventErrorOccurred:
{
NSLog(@"Crap, error!");
break;
}
case kCFStreamEventCanAcceptBytes:
{
NSLog(@"Stream can accept more bytes");
NSString *reqStr = [NSString stringWithFormat: @"ConReq"];
const UInt8 *rawstring = (const UInt8 *)[reqStr UTF8String];
CFWriteStreamWrite(stream, rawstring, strlen((char *)rawstring));
}
case kCFStreamEventNone:
{
NSLog(@"Nothing is happening");
break;
}
case kCFStreamEventOpenCompleted:
{
NSLog(@"Opened stream!");
break;
}
}
}
出现了问题:当我按下按钮时,它会在那里停留。记录显示案例kCFStreamEventCanAcceptBytes
只是继续被调用。实际上,当我强制执行程序时,服务器已经收到了一个包含大量ConReq
的文件。我应该怎么做,或者我做错了什么?
PS。我从here获得了代码。
答案 0 :(得分:1)
“可以接受”事件表示,如果您要发送更多数据,您可以发送(部分)数据而不会阻止。您的问题是您没有跟踪已发送的数据量,要发送的数据量以及套接字当前是否可以接受数据。相反,每次有空间发送更多数据时,每次都会发送完全相同的数据。它没有太多的数据,所以你应该很快就能看到很多“为更多数据做好准备”事件。