Frage

Ich habe viele Fragen zu diesem Thema haben auf dieser Website zu lesen aber haben sie nicht ruhig meine Frage beantworten. Wenn Sie nicht über mein Ziel oder Hintergrund überspringt auf die Frage ### werden.

Mein Ziel

wird an einen Server erstellen, die auf Mac OS X 10.4 + laufen können und später Portierung auf Windows XP / Vista (keine Ahnung, wie das noch zu tun, aber das ist ein Problem für später).

Dann lassen Sie das iPhone der Kunde sein, der die Computernamen, um zu sehen Lage ist, die den Server ausgeführt werden (durch WiFi). Der Benutzer des iPhone kann dann wählen Sie die Computernamen auf den Server, auf dem Computer zu verbinden.

Danach werden sie einfache Textnachrichten untereinander austauschen können. Zum Beispiel sendet das iPhone ‚knock knock‘ und der Server antwortet ‚Wer ist da?‘. Oder eine einfache Client:. 'Ping', Server antwortet 'Pong' wird gut tun

Hintergrund

Ich habe mit Steckdosen in der Vergangenheit gearbeitet, aber nur in Visual Basic 6 mit dem WINSOCKET.dll war es sehr einfach, einen TCP / IP-Server zu erstellen.

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

Mit dem Client Ich brauche nur den folgenden Geräte anschließen zu tun.

client.connect(localhost, 12203);

Es gab verfügbar einige Rückrufe wie connect, in der Nähe, DataArrival usw., die ich irgendetwas zu tun verwenden könnte ich will.

Vielleicht für das iPhone gibt es Bibliotheken für sie geschrieben, aber ist es so schwer, diese einfache Anwendung selbst zu erstellen? einige der Forschung Nachdem ich verstehe ich, dass ich in der Gegend von CFNetwork, CFHost, CFSocket, CFStream zu suchen.

Frage

Gibt es jemanden, der mich zu einem Tutorial führen könnte oder nach dem Code, wo Sie zwei Tasten auf dem iPhone haben. [Start Server] und [Connect to Server], wobei die ersten einen TCP / IP-Server auf einem bestimmten Port und die zweite Verbindung zu ihr beginnt.

Nachdem eine Verbindung ist vielleicht auch der Code eine einfache ‚Ping'-Nachricht an den Server, nachdem der Server empfängt diese antwortet mit einer‘ senden Pong'-Nachricht an den Client.

Das wäre wirklich hilfreich sein. Aber vielleicht für frage ich zu viel hier.

War es hilfreich?

Lösung

dieses Tutorial ein Chat-Beispiel-App funktioniert sehr gut zu schaffen und ist ziemlich einfach (any iphone noob, wie ich, kann es sogar Im Simulationsmodus funktioniert, verbindet es mit externem Socket-Server).

i angepasst es meinen Socket-Server zu sprechen und es funktioniert wie ein Charme. dies ist Testcode, so gibt es keine wirkliche Sorge mit losen Enden. es sendet nur eine Nachricht (Ihre Anmelde-ID) und erhält eine Antwort zurück, die es in der Konsole zeigt.

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

Ihre ViewController.h Datei enthalten würde

#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 NUR: Sie müssen Ihre Schaltfläche und Textfeld verknüpfen, indem Sie Strg-Taste und das Objekt in das Codefenster ziehen. wenn Sie das tun, über die Eigenschaften werden automatisch erstellt. überprüfen dieses Video-Tutorial wenn Sie stapfen sind

NOOBS NUR 2: diese Buchse ausgibt im Konsolenbereich von XCODE. auf der oberen rechte Ecke der Xcode-Fenster, HIDE klicken ODER DEBUG AREA (um Hilfe bitten, wenn nötig) zeigen.

gebaut und getestet (Simulator und Gerät) auf einem macbook mit 2 GB Speicher, Xcode 4.2 für Snow Leopard verwenden.

Andere Tipps

Ich empfehle die folgenden: Cocoa Async Sockel

Es gibt auch ein einfaches Beispiel-Projekt auf der Website, die Sie zu erhalten begonnen. Ich habe gute Erfolge hatte mit diesem Rahmen arbeiten.

Ich würde erwarten, würden Sie Ihren Server sollen bereits gestartet werden, und dann würden Sie nur eine „Mit Server verbinden“ Taste benötigen, und dann „Ping“. Andernfalls müssen Sie einen separaten Prozess auf dem Server-Box, die auf die „Start Server“ Nachricht reagiert und startet den Server.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top