Objective c N输出流多次写入
我试图使用NSStream对象打开套接字,然后在套接字上读写,但我遇到了一个问题 打开插座后,我不知道如何在插座上写字 以下是我的做法 1) 首先打开插座:Objective c N输出流多次写入,objective-c,iphone,cocoa-touch,sockets,Objective C,Iphone,Cocoa Touch,Sockets,我试图使用NSStream对象打开套接字,然后在套接字上读写,但我遇到了一个问题 打开插座后,我不知道如何在插座上写字 以下是我的做法 1) 首先打开插座: NSURL *website = [NSURL URLWithString:urlStr]; if (!website) { NSLog(@"%@ is not a valid URL"); return; } NSHost *hos
NSURL *website = [NSURL URLWithString:urlStr];
if (!website) {
NSLog(@"%@ is not a valid URL");
return;
}
NSHost *host = [NSHost hostWithName:urlStr];
// iStream and oStream are instance variables
[NSStream getStreamsToHost:host port:6667 inputStream:&iStream
outputStream:&oStream];
[iStream retain];
[oStream retain];
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];
2) 设置循环:
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
NSString *io;
if (theStream == iStream) io = @">>";
else io = @"<<";
NSLog(@"stream : %@",theStream);
NSString *event;
switch (streamEvent)
{
case NSStreamEventNone:
event = @"NSStreamEventNone";
break;
case NSStreamEventOpenCompleted:
event = @"NSStreamEventOpenCompleted";
break;
case NSStreamEventHasBytesAvailable:{
event = @"NSStreamEventHasBytesAvailables";
if (theStream == iStream)
{
if(!_data) {
_data = [[NSMutableData data] retain];
}
uint8_t buf[1024];
unsigned int len = 0;
len = [iStream read:buf maxLength:1024];
NSLog(@"Lenght data read : %d", len);
if(len) {
NSData * dataReceived= [[NSString stringWithFormat:@"%s\n", (char *)buf] dataUsingEncoding:NSUTF8StringEncoding];
NSString *s = [[NSString alloc] initWithData:dataReceived encoding:NSUTF8StringEncoding];
NSLog(@"Received _data: \"%@\"\n",s);
} else {
NSLog(@"nothing to read!");
}
}else {
NSLog(@"Not the good stream");
}
break;
}
case NSStreamEventHasSpaceAvailable:{
event = @"NSStreamEventHasSpaceAvailable";
if (theStream == oStream )
{
if(isConnexionCommandSent == NO){
[self sendCommand:@"My connection command"];
isConnexionCommandSent = YES;
}
}
break;
}
case NSStreamEventErrorOccurred:
event = @"NSStreamEventErrorOccurred";
NSError *theError = [theStream streamError];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[theError localizedDescription]
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
break;
case NSStreamEventEndEncountered:
event = @"NSStreamEventEndEncountered";
break;
default:
event = @"** Unknown";
}
NSLog(@"%@ : %@", io, event);
}
i>0,因此我假设写操作进行得很顺利,但在服务器上没有收到任何内容。。。我不知道为什么
你能帮我吗 嘿@Ptitaw看。我相信你会在那里找到答案,找到一种更简单的方式来连接并自动访问所有事件(阅读、写作等)
希望我能帮上忙:)一个非常晚的答案,但是,它可能对有类似问题的人有所帮助 我认为这可能是由于数据编码机制。您的服务器可能正在使用UTF-8编码,而您正在使用NSASCIIStringEncoding发送数据。试试这个:
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];
“[self sendCommand:@“我的连接命令”];”成功?如果“写入”成功,则意味着客户端tcp堆栈现在正在尝试传递这些字节。但是,如果tcp连接已断开,它将无法传递。你确定没有收到数据吗?你是如何验证的?
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];