Problem with cocoa async sockets
Problem with cocoa async sockets
- Subject: Problem with cocoa async sockets
- From: Samuli Lehtonen <email@hidden>
- Date: Sat, 4 Sep 2010 21:33:21 +0300
Hey I started using cocoa sockets sometime ago, so here is the code I got now, I am using the echo server example as server which was provided with the class. So what I am trying to do is, send a message from the server to client when the server receives the message, server gets the message, but client won't get the message that server is sending somehow. Only message client gets is the welcome message , I don't understand why it won't get the other messages, I've really struggled with this now, thanks in advance, I am more than grateful for help!
For the async socket class http://code.google.com/p/cocoaasyncsocket/
I was recommended to use this class for networking on forums, so I used it and it seems to be pretty simple expect my problem is pretty weird..
Here is server .m file
#import "AppController.h"
#import "AsyncSocket.h"
#define WELCOME_MSG 0
#define ECHO_MSG 1
#define FORMAT(format, ...) [NSString stringWithFormat:(format), ##__VA_ARGS__]
@interface AppController (PrivateAPI)
- (void)logError:(NSString *)msg;
- (void)logInfo:(NSString *)msg;
- (void)logMessage:(NSString *)msg;
@end
@implementation AppController
- (id)init
{
if(self = [super init])
{
listenSocket = [[AsyncSocket alloc] initWithDelegate:self];
connectedSockets = [[NSMutableArray alloc] initWithCapacity:1];
isRunning = NO;
}
return self;
}
- (void)awakeFromNib
{
[logView setString:@""];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSLog(@"Ready");
// Advanced options - enable the socket to contine operations even during modal dialogs, and menu browsing
[listenSocket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
}
- (void)scrollToBottom
{
NSScrollView *scrollView = [logView enclosingScrollView];
NSPoint newScrollOrigin;
if ([[scrollView documentView] isFlipped])
newScrollOrigin = NSMakePoint(0.0, NSMaxY([[scrollView documentView] frame]));
else
newScrollOrigin = NSMakePoint(0.0, 0.0);
[[scrollView documentView] scrollPoint:newScrollOrigin];
}
- (void)logError:(NSString *)msg
{
NSString *paragraph = [NSString stringWithFormat:@"%@\n", msg];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:1];
[attributes setObject:[NSColor redColor] forKey:NSForegroundColorAttributeName];
NSAttributedString *as = [[NSAttributedString alloc] initWithString:paragraph attributes:attributes];
[as autorelease];
[[logView textStorage] appendAttributedString:as];
[self scrollToBottom];
}
- (void)logInfo:(NSString *)msg
{
NSString *paragraph = [NSString stringWithFormat:@"%@\n", msg];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:1];
[attributes setObject:[NSColor purpleColor] forKey:NSForegroundColorAttributeName];
NSAttributedString *as = [[NSAttributedString alloc] initWithString:paragraph attributes:attributes];
[as autorelease];
[[logView textStorage] appendAttributedString:as];
[self scrollToBottom];
}
- (void)logMessage:(NSString *)msg
{
NSString *paragraph = [NSString stringWithFormat:@"%@\n", msg];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithCapacity:1];
[attributes setObject:[NSColor blackColor] forKey:NSForegroundColorAttributeName];
NSAttributedString *as = [[NSAttributedString alloc] initWithString:paragraph attributes:attributes];
[as autorelease];
[[logView textStorage] appendAttributedString:as];
[self scrollToBottom];
}
- (IBAction)startStop:(id)sender
{
if(!isRunning)
{
int port = [portField intValue];
if(port < 0 || port > 65535)
{
port = 0;
}
NSError *error = nil;
if(![listenSocket acceptOnPort:port error:&error])
{
[self logError:FORMAT(@"Error starting server: %@", error)];
return;
}
[self logInfo:FORMAT(@"Echo server started on port %hu", [listenSocket localPort])];
isRunning = YES;
[portField setEnabled:NO];
[startStopButton setTitle:@"Stop"];
}
else
{
// Stop accepting connections
[listenSocket disconnect];
// Stop any client connections
int i;
for(i = 0; i < [connectedSockets count]; i++)
{
// Call disconnect on the socket,
// which will invoke the onSocketDidDisconnect: method,
// which will remove the socket from the list.
[[connectedSockets objectAtIndex:i] disconnect];
}
[self logInfo:@"Stopped Echo server"];
isRunning = false;
[portField setEnabled:YES];
[startStopButton setTitle:@"Start"];
}
}
- (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket
{
[connectedSockets addObject:newSocket];
}
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
[self logInfo:FORMAT(@"Accepted client %@:%hu", host, port)];
NSString *welcomeMsg = @"Welcome to server";
NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];
[sock writeData:welcomeData withTimeout:-1 tag:WELCOME_MSG];
// We could call readDataToData:withTimeout:tag: here - that would be perfectly fine.
// If we did this, we'd want to add a check in onSocket:didWriteDataWithTag: and only
// queue another read if tag != WELCOME_MSG.
}
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
{
[sock readDataWithTimeout:-1 tag:0];
}
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length] )];
NSString *msg = [[[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding] autorelease];
if(msg)
{
[self logMessage:msg];
[sock writeData:strData withTimeout:-1 tag:0];
}
else
{
[self logError:@"Error converting received data into UTF-8 String"];
}
// Even if we were unable to write the incoming data to the log,
// we're still going to echo it back to the client.
[sock writeData:data withTimeout:-1 tag:ECHO_MSG];
}
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
{
[self logInfo:FORMAT(@"Client Disconnected: %@:%hu", [sock connectedHost], [sock connectedPort])];
}
- (void)onSocketDidDisconnect:(AsyncSocket *)sock
{
[connectedSockets removeObject:sock];
}
@end
Here is the .m file of my client program
//
// CheckerHandler.m
// PTZ place checker - OS X
//
// Created by Samuli Lehtonen on 3.9.2010.
// Copyright 2010 Test. All rights reserved.
//
#import "CheckerHandler.h"
#import "AsyncSocket.h"
@implementation CheckerHandler
#pragma mark Basicstuff
-(id)init
{
[super init];
connectSocket = [[AsyncSocket alloc] initWithDelegate:self];
[connectSocket setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
updateAvailable = FALSE;
NSLog(@"Retain count of Checker: %i", [self retainCount]);
return self;
}
-(void)dealloc
{
[connectSocket release];
[super dealloc];
}
#pragma mark Functions for the app
-(bool)openConnection:(NSString*)IP:(int)port
{
NSError * error = nil;
if(![connectSocket connectToHost:IP onPort:port error:&error]){
return false;
}
else {
return true;
}
}
-(void)checkForUpdates
{
NSString * version = [[NSString alloc] initWithString:@"REQUPV2"];
NSData * data = [version dataUsingEncoding:NSUTF8StringEncoding];
[connectSocket writeData:data withTimeout:-1 tag:0];
}
-(bool)isUpdateAvailable
{
return updateAvailable;
}
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
{
[sock readDataWithTimeout:-1 tag:0];
}
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length] )];
NSString *msg = [[[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding] autorelease];
if(msg)
{
NSLog(@"Message is: %@", msg);
}
else
{
}
}
@end
Sent from my macbook pro
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden