|  | #import <Cocoa/Cocoa.h> | 
|  | #import "TSocketServer.h" | 
|  | #import "TNSFileHandleTransport.h" | 
|  | #import "TProtocol.h" | 
|  |  | 
|  |  | 
|  | @implementation TSocketServer | 
|  |  | 
|  | - (id) initWithPort: (int) port | 
|  | protocolFactory: (id <TProtocolFactory>) protocolFactory | 
|  | processor: (id <TProcessor>) processor; | 
|  | { | 
|  | self = [super init]; | 
|  |  | 
|  | mInputProtocolFactory = [protocolFactory retain]; | 
|  | mOutputProtocolFactory = [protocolFactory retain]; | 
|  | mProcessor = [processor retain]; | 
|  |  | 
|  | // create a socket | 
|  | mServerSocket = [[NSSocketPort alloc] initWithTCPPort: 8081]; | 
|  | // wrap it in a file handle so we can get messages from it | 
|  | mSocketFileHandle = [[NSFileHandle alloc] initWithFileDescriptor: [mServerSocket socket] | 
|  | closeOnDealloc: YES]; | 
|  |  | 
|  | // register for notifications of accepted incoming connections | 
|  | [[NSNotificationCenter defaultCenter] addObserver: self | 
|  | selector: @selector(connectionAccepted:) | 
|  | name: NSFileHandleConnectionAcceptedNotification | 
|  | object: mSocketFileHandle]; | 
|  |  | 
|  | // tell socket to listen | 
|  | [mSocketFileHandle acceptConnectionInBackgroundAndNotify]; | 
|  |  | 
|  | return self; | 
|  | } | 
|  |  | 
|  |  | 
|  | - (void) dealloc { | 
|  | [mInputProtocolFactory release]; | 
|  | [mOutputProtocolFactory release]; | 
|  | [mProcessor release]; | 
|  | [mSocketFileHandle release]; | 
|  | [mServerSocket release]; | 
|  | [super dealloc]; | 
|  | } | 
|  |  | 
|  |  | 
|  | - (void) connentionAccepted: (NSNotification *) aNotification | 
|  | { | 
|  | NSFileHandle * socket = [[aNotification userInfo] objectForKey: NSFileHandleNotificationFileHandleItem]; | 
|  |  | 
|  | // now that we have a client connected, spin off a thread to handle activity | 
|  | [NSThread detachNewThreadSelector: @selector(handleClientConnection:) | 
|  | toTarget: self | 
|  | withObject: socket]; | 
|  |  | 
|  | [[aNotification object] acceptConnectionInBackgroundAndNotify]; | 
|  | } | 
|  |  | 
|  |  | 
|  | - (void) handleClientConnection: (NSFileHandle *) clientSocket | 
|  | { | 
|  | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; | 
|  |  | 
|  | TNSFileHandleTransport * transport = [[TNSFileHandleTransport alloc] initWithFileHandle: clientSocket]; | 
|  |  | 
|  | id <TProtocol> inProtocol = [mInputProtocolFactory newProtocolOnTransport: transport]; | 
|  | id <TProtocol> outProtocol = [mOutputProtocolFactory newProtocolOnTransport: transport]; | 
|  |  | 
|  | while ([mProcessor processOnInputProtocol: inProtocol outputProtocol: outProtocol]); | 
|  |  | 
|  | [pool release]; | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | @end | 
|  |  | 
|  |  | 
|  |  |