PDA

View Full Version : Sending an NSImage on a Network


mindwalkernine
2006.07.23, 08:27 PM
Hopefully there are some Cocoa game network programmers, because my question is about sending an NSImage from one computer to another.

Additionally, could someone help me out with the protocols. I don't know how to write them for this kind of thing.

Here's all of my server and client code:

---------- CLIENT CODE ----------
/* MyView */

#import <Cocoa/Cocoa.h>

@interface MyView : NSView
{
NSImage *myImage;
}

- (void)setImage:(NSImage *)image;

@end

#import "MyView.h"

@implementation MyView

- (id)initWithFrame:(NSRect)frameRect
{
if ((self = [super initWithFrame:frameRect]) != nil)
{

}

return self;
}

- (void)setImage:(NSImage *)image
{
[image retain];

[myImage release];

myImage = image;

[self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)rect
{
NSRect bounds = [self bounds];

if(myImage)
{
NSRect imageRect;
NSRect drawingRect;

imageRect.origin = NSZeroPoint;
imageRect.size = [myImage size];
drawingRect = imageRect;
[myImage
drawInRect:drawingRect
fromRect:imageRect
operation:NSCompositeSourceOver
fraction:1.0
];
}
else
NSLog(@"Did not draw myImage.");
}

@end


/* Controller */

#import <Cocoa/Cocoa.h>

#import "MyView.h"

@interface Controller : NSObject
{
NSSocketPort *port;
NSConnection *connection;

IBOutlet NSView *myView;
}

- (void)setImage:(NSImage *)image;

- (IBAction)vendService:(id)sender;

@end

#import "Controller.h"

@implementation Controller

- (void)setImage:(NSImage *)image
{
[myView setImage:image];
}

- (IBAction)vendService:(id)sender
{
port = [[NSSocketPort alloc] initWithTCPPort:12345];

connection = [[NSConnection connectionWithReceivePort:port sendPort:nil] retain];

[connection setRootObject:self];

if(![[NSSocketPortNameServer sharedInstance] registerPort:port name:@"server"])
{
NSLog(@"Could not register name of server.");
}
}

@end

---------- CLIENT CODE ----------
/* Controller */

#import <Cocoa/Cocoa.h>

@interface Controller : NSObject
{
IBOutlet NSTextField *messageField;

NSSocketPort *port;
NSConnection *connection;
NSDistantObject *proxy;

NSImage *anImage;
}

- (IBAction)createProxy:(id)sender;
- (IBAction)sendImage:(id)sender;

@end


#import "Controller.h"

@implementation Controller

- (id)init
{
self = [super init];

if ( self )
{
anImage = [[NSImage alloc] initWithContentsOfFile:@"/users/jordanevans/desktop/snapshot.tiff"];
[anImage retain];
}

return self;
}

- (IBAction)createProxy:(id)sender
{
port = [[NSSocketPortNameServer sharedInstance] portForName:@"server" host:@"*"];

connection = [NSConnection connectionWithReceivePort:nil sendPort:port];

proxy = [[connection rootProxy] retain];

}

- (IBAction)sendImage:(id)sender
{
if( ![proxy setImage:anImage] )
{
NSLog(@"Did not set send image.");
}
}

@end

djork
2006.08.09, 08:23 AM
My general approach would be to use archivers and unarchivers. This makes sending objects over a network pretty trivial.

http://www.cocoadev.com/index.pl?UsingArchiversAndUnarchivers