Note that there are some explanatory texts on larger screens.

plurals
  1. PONSStream Failing To Receive Data
    primarykey
    data
    text
    <p>I am making a chat application using NSStreams that connect to a simple c socket server. The stream connects successfully, and sends data, but it is unable to receive the data. Here is my Socket class that uses NSStreams:</p> <p>Socket.h</p> <pre><code>@interface Socket : NSObject &lt;NSStreamDelegate&gt; - (void)connectToServerWithIP:(NSString *)ip andPort:(int)port; - (NSString *)sendMessage:(NSString *)outgoingMessage; @end </code></pre> <p>Socket.m</p> <pre><code>#import "Socket.h" @interface Socket () @property (strong, nonatomic) NSInputStream *inputStream; @property (strong, nonatomic) NSOutputStream *outputStream; @property (strong, nonatomic) NSString *output; @end @implementation Socket @synthesize inputStream; @synthesize outputStream; @synthesize output; - (void)connectToServerWithIP:(NSString *)ip andPort:(int)port { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)ip, port, &amp;readStream, &amp;writeStream); inputStream = (__bridge_transfer NSInputStream *)readStream; outputStream = (__bridge_transfer NSOutputStream *)writeStream; [inputStream setDelegate:self]; [outputStream setDelegate:self]; [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [inputStream open]; [outputStream open]; } - (NSString *)sendMessage:(NSString *)outgoingMessage { NSData *messageData = [outgoingMessage dataUsingEncoding:NSUTF8StringEncoding]; const void *bytes = [messageData bytes]; uint8_t *uint8_t_message = (uint8_t*)bytes; [outputStream write:uint8_t_message maxLength:strlen([outgoingMessage cStringUsingEncoding:[NSString defaultCStringEncoding]])]; while (![inputStream hasBytesAvailable]) { usleep(10); } uint8_t buffer[1024]; [inputStream read:buffer maxLength:1023]; NSString *outputString = [NSString stringWithUTF8String:(char *)buffer]; return outputString; } - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { NSLog(@"Stream Event: %lu", streamEvent); switch (streamEvent) { case NSStreamEventOpenCompleted: NSLog(@"Stream opened"); break; case NSStreamEventHasBytesAvailable: if (theStream == inputStream) { uint8_t buffer[1024]; long len; while ([inputStream hasBytesAvailable]) { len = [inputStream read:buffer maxLength:sizeof(buffer)]; if (len &gt; 0) { output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; if (output) { NSLog(@"Data: %@", output); } } } } break; case NSStreamEventErrorOccurred: NSLog(@"Can not connect to the host!"); break; case NSStreamEventEndEncountered: [theStream close]; [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; theStream = nil; break; default: NSLog(@"Unknown event"); } } @end </code></pre> <p>ChatViewController.m</p> <pre><code>// // ChatViewController.m // Chat // // Created by James Pickering on 10/5/13. // Copyright (c) 2013 James Pickering. All rights reserved. // #import "ChatViewController.h" #import "LoginViewController.h" #import "StatusView.h" @interface ChatViewController () @property (strong) IBOutlet NSTableView *people; @property (strong) IBOutlet NSTextField *message; @property (strong) IBOutlet NSButton *send; @property (strong) IBOutlet NSButton *loginButton; @property (strong) IBOutlet NSButton *settingsButton; @property (strong) IBOutlet NSButton *panicButton; @property (strong, nonatomic) NSString *recievedText; @property (strong, nonatomic) NSMutableArray *tableData; @property (strong, nonatomic) NSInputStream *inputStream; @property (strong, nonatomic) NSOutputStream *outputStream; - (void)openChat:(id)sender; - (IBAction)panic:(id)sender; - (IBAction)loginToChat:(id)sender; @end @implementation ChatViewController @synthesize sock; @synthesize recievedText; @synthesize inputStream; @synthesize outputStream; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.isLoggedIn = FALSE; sock = [[Socket alloc] init]; [sock connectToServerWithIP:@"127.0.0.1" andPort:5001]; //[self updateUI]; } return self; } - (void)updateUI { if (self.isLoggedIn) { recievedText = [sock sendMessage:@"getPeople"]; self.tableData = [[NSMutableArray alloc] initWithArray:[recievedText componentsSeparatedByString:@";"]]; NSLog(@"%@", self.tableData); [self.people reloadData]; } } - (void)openChat:(id)sender { NSLog(@"tru"); } - (IBAction)panic:(id)sender { } - (IBAction)loginToChat:(id)sender { NSLog(@"Called"); if (self.loginPopover == nil) { NSLog(@"Login Popover is nil"); self.loginPopover = [[NSPopover alloc] init]; self.loginPopover.contentViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil]; } if (!self.loginPopover.isShown) { NSLog(@"Login Popover is opening"); [self.loginButton setTitle:@"Cancel"]; [self.settingsButton setEnabled:NO]; [self.send setEnabled:NO]; [self.message setEnabled:NO]; [self.loginPopover showRelativeToRect:self.loginButton.frame ofView:self.view preferredEdge:NSMinYEdge]; } else { NSLog(@"Login Popover is closing"); [self.loginButton setTitle:@"Login"]; [self.settingsButton setEnabled:YES]; [self.send setEnabled:YES]; [self.message setEnabled:YES]; [self.loginPopover close]; } } - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView { return [self.tableData count]; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { return [self.tableData objectAtIndex:rowIndex]; } - (BOOL)canBecomeKeyWindow { return YES; } - (BOOL)loginWithUsername:(NSString *)username andPassword:(NSString *)password { // Error happens here recievedText = [sock sendMessage:@"login"]; if ([recievedText isEqualToString:@"roger"]) { recievedText = [sock sendMessage:[NSString stringWithFormat:@"%@;%@", username, password]]; if ([recievedText isEqualToString:@"access granted"]) { return YES; } else { return NO; } } else { return NO; } } @end </code></pre> <p>The problem is that it hangs on this one line of code forever: <code>while (![inputStream hasBytesAvailable]) {}</code>, but I have no idea why. The server should be sending a message back.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload