IOS Hello World on top of socket

I need to implement a simple connection (link) connection between an iOS application and my Java socket server. I manage to connect these two, but I can not send any messages. The Java server is pretty much taken from this example , and this is part of my code where I establish a connection and (try) send a message to the server:

- (void)initNetworkCommunication { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.10", 2004, &readStream, &writeStream); self.inputStream = objc_unretainedObject(readStream); self.outputStream = objc_unretainedObject(writeStream); [self.inputStream setDelegate:self]; [self.outputStream setDelegate:self]; [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.inputStream open]; [self.outputStream open]; } - (void)sendMessage { NSString *response = [NSString stringWithFormat:@"aaa"]; NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; [self.outputStream write:[data bytes] maxLength:[data length]]; } - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { NSLog(@"stream event %i", streamEvent); switch (streamEvent) { case NSStreamEventOpenCompleted: NSLog(@"Stream opened"); break; case NSStreamEventHasBytesAvailable: if (theStream == self.inputStream) { uint8_t buffer[1024]; int len; while ([self.inputStream hasBytesAvailable]) { len = [self.inputStream read:buffer maxLength:sizeof(buffer)]; if (len > 0) { NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; if (nil != output) { NSLog(@"server said: %@", output); //[self messageReceived: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"); } } - (IBAction)loginButtonClicked { [self initNetworkCommunication]; [self sendMessage]; ...} 
+4
source share
2 answers

Too late for an answer .. Hope this helps someone ...

To send String over Sockets, you must mark the end of the string. i.e; Add \ n

In the above example:

Method: sendMessage

 NSString *response = [NSString stringWithFormat:@"aaa\n"]; 
+4
source

It is better to add something that cannot be printed - for example, 0x00 - at the end. Thus, your message can contain anything.

0
source

Source: https://habr.com/ru/post/1383580/


All Articles