CS185c
Chris Pollett
Oct. 18, 2009
import java.io.*; import java.net.*; public final class MyServer extends Thread { private static final int PORT=8889; private static final int NUM_CONNECT=1; private MyServer() {} public static void main(String args[]) { MyServer myServer = new MyServer(); if(myServer !=null) {myServer.start();} } public void run() { try { ServerSocket server = new ServerSocket(PORT, NUM_CONNECT); Socket client = server.accept(); BufferedReader reader = new BufferedReader( new InputStreamReader(client.getInputStream())); PrintWriter writer = new PrintWriter(new BufferedWriter( new OutputStreamWriter(client.getOutputStream()))); String line = reader.readLine(); System.out.println("Hello"+line); if(line.equals("HELLO")) { writer.print("Chicago:New York:San Francisco:"); writer.print("Chicago:New York:San Francisco:"); writer.println("Chicago:New York:San Francisco\n"); } writer.flush(); } catch(IOException ie) { ie.printStackTrace(); } } }
Which of the following is true?
CFSocketContext context = { 0, msg, NULL, NULL, NULL }; CFSocketRef client = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack, (CFSocketCallBack)ConnectCallBack, &context);
struct CFSocketContext { CFIndex version; // must be 0 void *info; // data to send CFAllocatorRetainCallBack retain; // callback called when do CFRetain, CFRelease,CFCopy CFAllocatorReleaseCallBack release; CFAllocatorCopyDescriptionCallBack copyDescription; };
CFSocketRef CFSocketCreate ( CFAllocatorRef allocator, SInt32 protocolFamily, //PF_INET is IPv4 SInt32 socketType, SInt32 protocol, CFOptionFlags callBackTypes, //when we want to be called back CFSocketCallBack callout, //our callback const CFSocketContext *context );
struct sockaddr_in theName; struct hostent *hp; CFDataRef addressData; theName.sin_port = htons(8889); theName.sin_family = AF_INET; //what kind in internet addresses to use; want IP hp = gethostbyname("pollett.org"); if( hp == NULL ) { return; } memcpy( &theName.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length ); addressData = CFDataCreate( NULL, (UInt8 *)&theName, (CFIndex)sizeof( struct sockaddr_in ) );
CFSocketConnectToAddress(client, addressData, 1); //connect; 1 second timeout CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, client, 0); CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes); CFRelease(sourceRef); CFRunLoopRun();
CFSocketNativeHandle sock; UInt8 buffer[1024]; void ConnectCallBack( CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) { char *msg = info; NSLog(@"%s\n", msg); sock = CFSocketGetNative(socket); send(sock, msg, strlen(msg)+1, 0); recv(sock, buffer, sizeof(buffer), 0); NSLog(@"Got: %s \n", buffer); CFRunLoopStop(CFRunLoopGetCurrent()); //return execution to our program return; }
CFReadStreamRef readStream = NULL; CFWriteStreamRef writeStream = NULL; CFStreamCreatePairWithSocket(kCFAllocatorDefault, sock, &readStream, &writeStream);
NSOutputStream *networkOutputStream = (NSOutputStream *) writeStream; NSInputStream *networkInputStream =(NSInputStream *) readStream;and then work in Objective-C land.
#pragma mark - #pragma mark Table View Controller Methods
NSString *data = [[NSString alloc] initWithCString: (char*)buffer encoding: NSASCIIStringEncoding]; NSArray *array = [data componentsSeparatedByString:@":"]; [array retain]; self.listData = array; [array release]; [data release];
-(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier"; UITableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier]; if(cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier: SimpleTableIdentifier] autorelease]; } NSUInteger row = [indexPath row]; cell.textLabel.text = [listData objectAtIndex:row]; return cell; }