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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to