我想使用NSStream对象打开然后写入和读取一个套接字,但我有一个问题。NSOuputStream多次写入
我不知道在打开它之后如何在套接字上编写代码。
下面是如何我已经做
1)第一开扩套接字:
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);
}
3)然后我有一个功能,是当我触摸按钮时调用
- (IBAction)join:(id)sender{
if([oStream hasSpaceAvailable]){
NSLog(@"iStream Status : %d",[iStream streamStatus]);
NSLog(@"oStream Status : %d",[oStream streamStatus]);
[self sendCommand:@"join"];
}else{
NSLog(@"Error command can't be sent");
}
}
-(void) sendCommand:(NSString *) command{
NSLog(@"space : %d",[oStream hasSpaceAvailable]);
if ([oStream hasSpaceAvailable])
{
NSLog(@"Command writen : %s\n",[command cStringUsingEncoding:NSASCIIStringEncoding]);
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];
if (i<0)
{
NSLog(@"erreur lors de l'envoi, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]);
}
isReadyToSend = NO;
}
else
{
NSLog(@"impossible d'envoyer, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]);
}
}
但问题是,当函数加入被调用时,一切顺利,但服务器收到什么...
在
NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]];
我是> 0,所以我认为写作去好吧,但在服务器上没有收到任何东西...我不知道为什么...
你能帮我吗?
是否'[self sendCommand:@“My connection command”];'成功? 如果“写入”成功,则意味着客户端tcp堆栈正在尝试传递这些字节。但是如果tcp连接已经死亡,它将不会被传送。你确定数据没有收到,你是如何验证这一点的? – 2010-02-03 11:51:40