iPhone TCP/IP Socket Server/Client Program

前端 未结 3 1608
后悔当初
后悔当初 2020-12-12 19:41

I have read a lot of questions regarding this subject on this website however they didn\'t quiet answer my question. If you can\'t be ### about my goal or background ski

相关标签:
3条回答
  • 2020-12-12 20:16

    I recommend the the following: Cocoa Async Socket

    There's also a basic example project on the site to get you started. I've had good success working with that framework.

    0 讨论(0)
  • 2020-12-12 20:25

    I would expect you would want your server to already be started, and then you would only need a "Connect to Server" button, and then your "Ping". Otherwise, you need a separate process on your server box which responds to the "Start Server" message and starts the server.

    0 讨论(0)
  • 2020-12-12 20:26

    this tutorial to create a chat sample app works very well and is pretty straightforward (any iphone noob, like me, can make it work, EVEN IN SIMULATOR MODE it connects to external socket server).

    i adapted it to talk my socket server and it works like a charm. this is test code, so there's no real concern with loose ends. it only sends one message (your logon id) and receives an answer back, which it shows in the console.

    //
    //  ViewController.m
    //  zdelSocketTest01a
    //
    //
    
    #import "ViewController.h"
    
    
    
    @implementation ViewController
    @synthesize inputNameField;
    @synthesize joinView;
    
    - (void)initNetworkCommunication {
    
        uint portNo = 5555;
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"227.3.4.56", portNo, &readStream, &writeStream);
        inputStream = (__bridge NSInputStream *)readStream;
        outputStream = (__bridge NSOutputStream *)writeStream;
    
        [inputStream setDelegate:self];
        [outputStream setDelegate:self];
    
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];
        [outputStream open];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Release any cached data, images, etc that aren't in use.
    }
    
    #pragma mark - View lifecycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self initNetworkCommunication];
        messages = [[NSMutableArray alloc] init];
    }
    
    - (void)viewDidUnload
    {
        [self setInputNameField:nil];
        [self setJoinView:nil];
        [self setJoinView:nil];
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
    }
    
    - (void)viewDidDisappear:(BOOL)animated
    {
        [super viewDidDisappear:animated];
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Return YES for supported orientations
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    
    - (IBAction)joinChat:(id)sender {
    
        NSString *response  = [NSString stringWithFormat:@"logon,%@", inputNameField.text];
        NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
        [outputStream write:[data bytes] maxLength:[data length]];
    
    }
    /*
     - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
     NSLog(@"stream event %i", streamEvent);
     }
     */
    
    - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
        typedef enum {
            NSStreamEventNone = 0,
            NSStreamEventOpenCompleted = 1 << 0,
            NSStreamEventHasBytesAvailable = 1 << 1,
            NSStreamEventHasSpaceAvailable = 1 << 2,
            NSStreamEventErrorOccurred = 1 << 3,
            NSStreamEventEndEncountered = 1 << 4
        };
        uint8_t buffer[1024];
        int len;
    
        switch (streamEvent) {
    
            case NSStreamEventOpenCompleted:
                NSLog(@"Stream opened now");
                break;
            case NSStreamEventHasBytesAvailable:
                NSLog(@"has bytes");
                if (theStream == inputStream) {
                    while ([inputStream hasBytesAvailable]) {
                        len = [inputStream read:buffer maxLength:sizeof(buffer)];
                        if (len > 0) {
    
                            NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
    
                            if (nil != output) {
                                NSLog(@"server said: %@", output);
                            }
                        }
                    }
                } else {
                    NSLog(@"it is NOT theStream == inputStream");
                }
                break;
            case NSStreamEventHasSpaceAvailable:
                NSLog(@"Stream has space available now");
                break;
    
    
            case NSStreamEventErrorOccurred:
                NSLog(@"Can not connect to the host!");
                break;
    
    
            case NSStreamEventEndEncountered:
    
                [theStream close];
                [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    
                break;
    
            default:
                NSLog(@"Unknown event %i", streamEvent);
        }
    
    }
    /*
     - (void) messageReceived:(NSString *)message {
    
     [messages addObject:message];
     [self.tView reloadData];
    
     }
     */
    
    @end
    

    your ViewController.h file would contain

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController <NSStreamDelegate>
    @property (weak, nonatomic) IBOutlet UITextField *inputNameField;
    @property (weak, nonatomic) IBOutlet UIView *joinView;
    - (IBAction)joinChat:(id)sender;
    
    
    @end
    NSInputStream *inputStream;
    NSOutputStream *outputStream;
    NSMutableArray * messages;
    

    NOOBS ONLY: you must link your button and text field by pressing CONTROL and dragging the object into the code window. when you do that, the properties above will automatically be created. check this video tutorial if you are stumped

    NOOBS ONLY 2: this socket will output in the CONSOLE PANE of XCODE. on the upper right hand corner of your xcode window, click HIDE OR SHOW THE DEBUG AREA (ask for help if necessary).

    built and tested (simulator and device) on a macbook with 2GB memory, using xcode 4.2 for snow leopard.

    0 讨论(0)
提交回复
热议问题