Pregunta

He leído muchas preguntas sobre este tema en este sitio web, pero no respondieron en silencio a mi pregunta. Si no puede ser ### acerca de mi objetivo o antecedentes, pase a la pregunta.

Mi objetivo

Es construir un servidor que pueda ejecutarse en Mac OS X 10.4+ y posterior, portarlo a Windows XP / Vista (no tengo idea de cómo hacerlo todavía, pero eso es un problema para más adelante).

Luego, deje que el iPhone sea el cliente que pueda ver los nombres de las computadoras que ejecutan el servidor (a través de WiFi). El usuario del iPhone puede seleccionar el nombre de la computadora para conectarse al servidor en esa computadora.

Después de eso, pueden enviarse mensajes de texto simples entre sí. Por ejemplo, el iPhone envía 'Knock Knock' y el servidor responde 'Who is there?'. O un cliente simple: 'Ping', el servidor responde 'Pong' funcionará bien.

Fondo

He trabajado con sockets en el pasado, pero solo en Visual Basic 6 con WINSOCKET.dll fue muy fácil crear un servidor TCP / IP.

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

Con el cliente solo tenía que hacer lo siguiente para conectarme.

client.connect(localhost, 12203);

Hubo algunas devoluciones de llamada disponibles, como conectar, cerrar, arribo de datos, etc., que podría usar para hacer lo que quiera.

Quizás para el iPhone hay bibliotecas escritas para ello, pero ¿es tan difícil crear esta sencilla aplicación usted mismo? Después de investigar un poco, entiendo que tengo que buscar en el área de CFNetwork, CFHost, CFSocket, CFStream.

Pregunta

¿Hay alguien que pueda guiarme a un tutorial o publicar el código donde tiene dos botones en el iPhone? [Iniciar servidor] y [Conectarse al servidor] donde el primero iniciará un servidor TCP / IP en un puerto determinado y el segundo se conecta a él.

Después de que se haya realizado una conexión, tal vez también el código para enviar un simple mensaje 'Ping' al servidor después de que el servidor reciba esto responda con un mensaje 'Pong' al cliente.

Eso sería realmente útil. Pero tal vez estoy pidiendo mucho aquí.

¿Fue útil?

Solución

este tutorial para crear una aplicación de muestra de chat funciona muy bien y es bastante sencillo (cualquier novato de iPhone, como yo, puede hacerlo funcionar, INCLUSO EN MODO SIMULADOR, se conecta al servidor de socket externo).

lo adapté para hablar de mi servidor de socket y funciona de maravilla. Este es el código de prueba, por lo que no hay preocupación real con los cabos sueltos. solo envía un mensaje (su identificación de inicio de sesión) y recibe una respuesta, que se muestra en la consola.

//
//  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

su archivo ViewController.h contendría

#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: debe vincular su botón y campo de texto presionando CONTROL y arrastrando el objeto a la ventana de código. cuando haga eso, las propiedades anteriores se crearán automáticamente. consulte este video tutorial si está perplejo

NOOBS SOLAMENTE 2: este socket saldrá en el PANEL DE CONSOLA de XCODE. en la esquina superior derecha de la ventana de xcode, haga clic en OCULTAR O MOSTRAR EL ÁREA DE DEPURACIÓN (solicite ayuda si es necesario).

construido y probado (simulador y dispositivo) en un macbook con 2 GB de memoria, utilizando xcode 4.2 para leopardo de las nieves.

Otros consejos

Recomiendo lo siguiente: Enchufe asíncrono de cacao

También hay un proyecto de ejemplo básico en el sitio para comenzar. He tenido mucho éxito trabajando con ese marco.

Esperaría que quisiera que su servidor ya se haya iniciado, y luego solo necesitaría un "Conectar al servidor". botón, y luego su " Ping " ;. De lo contrario, necesita un proceso separado en la casilla de su servidor que responde al " Iniciar servidor " mensaje e inicia el servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top