Domanda

Ho letto molte domande su questo argomento su questo sito Web, ma non hanno fatto silenzio a rispondere alla mia domanda. Se non puoi essere ### sul mio obiettivo o sullo sfondo, passa alla domanda.

Il mio obiettivo

È quello di costruire un server che può essere eseguito su Mac OS X 10.4+ e versioni successive, portarlo su Windows XP / Vista (non ho ancora idea di come farlo, ma questo è un problema per dopo).

Quindi lascia che l'iPhone sia il client in grado di vedere i nomi dei computer che eseguono il server (tramite WiFi). L'utente dell'iPhone può quindi selezionare il nome del computer per connettersi al server su quel computer.

Dopodiché possono scambiarsi semplici messaggi di testo. Ad esempio, l'iPhone invia "Knock Knock" e il server risponde "Who is there?". O un semplice client: "Ping", il server risponde "Pong" andrà bene.

Sfondo

Ho lavorato con socket in passato, ma solo in Visual Basic 6 con WINSOCKET.dll è stato molto semplice creare un server TCP / IP.

server.host = localhost;
server.port = 12203;
server.listen(); 

Con il client dovevo solo fare quanto segue per connettermi.

client.connect(localhost, 12203);

C'erano alcuni callback disponibili come connect, close, dataArrival, ecc. che potevo usare per fare tutto quello che volevo.

Forse per iPhone ci sono librerie scritte per questo, ma è così difficile creare questa semplice applicazione da soli? Dopo aver fatto qualche ricerca, capisco che devo guardare nell'area di CFNetwork, CFHost, CFSocket, CFStream.

Domanda

C'è qualcuno che potrebbe guidarmi a un tutorial o pubblicare il codice in cui hai due pulsanti sull'iPhone. [Avvia server] e [Connetti al server] dove il primo avvierà un server TCP / IP su una determinata porta e il secondo si connetterà ad esso.

Dopo che è stata stabilita una connessione, forse anche il codice per inviare un semplice messaggio "Ping" al server dopo che il server ha ricevuto questa risposta risponde con un messaggio "Pong" al client.

Sarebbe davvero utile. Ma forse sto chiedendo troppo qui.

È stato utile?

Soluzione

questo tutorial per creare un'app di esempio di chat funziona molto bene ed è piuttosto semplice (qualsiasi iphone noob, come me, può farlo funzionare, ANCHE IN MODALITÀ SIMULATORE si collega al server socket esterno).

L'ho adattato per parlare al mio server socket e funziona come un fascino. questo è un codice di prova, quindi non c'è vera preoccupazione con le estremità libere. invia solo un messaggio (il tuo ID di accesso) e riceve una risposta, che mostra nella 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

il tuo file ViewController.h conterrebbe

#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;

SOLO NOOBS: è necessario collegare il pulsante e il campo di testo premendo CONTROL e trascinando l'oggetto nella finestra del codice. quando lo fai, le proprietà sopra verranno create automaticamente. controlla questo tutorial video se sei sconcertato

SOLO NOOBS 2: questo socket verrà emesso nel PANNELLO CONSOLE di XCODE. nell'angolo in alto a destra della finestra del tuo xcode, fai clic su NASCONDI O MOSTRA L'AREA DEBUG (chiedi aiuto se necessario).

costruito e testato (simulatore e dispositivo) su un macbook con 2 GB di memoria, usando xcode 4.2 per snow leopard.

Altri suggerimenti

Raccomando quanto segue: Socket asincrono cacao

C'è anche un progetto di esempio di base sul sito per iniziare. Ho avuto un buon successo lavorando con quel framework.

Mi aspetto che vorresti che il tuo server fosse già avviato, e quindi avresti bisogno solo di un "Connetti al server" e poi il tuo " Ping " ;. Altrimenti, è necessario un processo separato sulla casella del server che risponda al "Start Server" messaggio e avvia il server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top