writeData в syncsocket всегда блокируется на iPhone

Я использую пример asyncsocket в качестве отправной точки, чтобы узнать больше о беспроводной сети на iPhone.

На Mac я запускаю образец сервера, открывающий порт 0. Это работает, поскольку я могу записывать данные с помощью тестового клиента, работающего на Mac.

На iPhone я думаю, что мне удалось подключиться, поскольку «потоки подключены» возвращает ДА.

Затем я хотел бы отправить данные с помощью syncsocket: (ОТРЕДАКТИРОВАННАЯ ВЕРСИЯ С ПОЛНЫМ КОДОМ)

import "InterfaceTestAppDelegate.h" import "InterfaceTestViewController.h" import "AsyncSocket.h" import "SyncSocket.h"

@implementation InterfaceTestAppDelegate

@synthesize window; @synthesize viewController;

  • (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)remoteHost port:(UInt16)remotePort { NSLog(@"Socket is connected!");

    NSLog(@"Remote Address: %@:%hu", remoteHost, remotePort);

    NSString *localHost = [sock localHost]; UInt16 localPort = [sock localPort];

    NSLog(@"Local Address: %@:%hu", localHost, localPort); }

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"application:didFinishLaunchingWithOptions:");

    /* asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];

            NSError *err = nil;
                if (![asyncSocket connectToHost: @"192.168.0.30" onPort: 1234 error: &err])
                {
                    NSLog(@"Error connecting: %@", err);
                }
        NSData *data = [@"testxyz" dataUsingEncoding:NSUTF8StringEncoding];
    
        NSLog(@"trace 1");
        [asyncSocket writeData:data withTimeout:10 tag:0];
        NSLog(@"trace 2");
    

    */ syncSocket = [[SyncSocket alloc] initWithTimeout: 10]; syncSocket.nsLog = YES; if (![syncSocket connectToHost: @"192.168.0.30" onPort: 12345]) { NSLog(@"Error connecting syncSocket:"); } NSData *data = [@"testxyz" dataUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"syncSocket trace 1"); [syncSocket writeData:data]; NSLog(@"syncSocket trace 2");

[окно addSubview: viewController.view]; [окно makeKeyAndVisible]; вернуть ДА; }

Он никогда не продолжает отправлять данные, writeData всегда блокируется. IP 192.168.0.30 - это IP моего Mac. Я просто использовал любой порт 12345, как вы предложили выше.

Но я действительно не знаю, что мне нужно сделать на Mac, чтобы получить ??

Как видите, я использую syncsocket, а затем он блокируется.

Я также пробовал asyncSocket, затем я получаю сообщение в классе asyncsocket: writeStream Can NOT Accept Bytes

Может быть, я неправильно настроил Mac, т.е. какое приложение мне нужно запустить на Mac для тестирования? Большое спасибо!


person user387184    schedule 18.03.2011    source источник
comment
Я не знаю, как реализован SyncSocket, но название Sync, вероятно, означает, что он синхронный, а не асинхронный.   -  person zrzka    schedule 18.03.2011
comment
Посмотрите здесь, code.google.com/p/cocoaasyncsocket/wiki/iPhone, как другие реализуют это ...   -  person zrzka    schedule 18.03.2011
comment
ссылка ... Именно с этого я начал и где у меня сейчас проблема ...   -  person user387184    schedule 18.03.2011


Ответы (1)


Как бы то ни было, именно так вы обычно читаете некоторые данные с помощью AsyncSocket:

-(void)onSocket:(AsyncSocket *)sock
        didReadData:(NSData*)data withTag:(long)tag
    {
    [data getBytes:&getMe length:sizeof(CommProt)];
    // now, you must roll in the next read...
    [sock readDataToLength:sizeof(CommProt) withTimeout:-1 tag:0];  

    // CommProt is your communications protocol, so sizeof(CommProt)
    // is how much to read at a chunk.

    // you can now simply access the fields of getMe,
    // for example getMe.x, getMe.y, getMe.latestValue etc etc.

    // hope it helps!
    }

Конечно, вы бы ранее использовали первую команду чтения для начинающих:

Вы делаете это, когда подключаетесь к хосту, следовательно:

-(void)onSocket:(AsyncSocket *)sock
        didConnectToHost:(NSString *)host port:(UInt16)port
    {
    if ( yourAppSaysItsOkToConnectAtThisMoment == NO )
        {
        [sock disconnect];  // (so easy, AsyncSockets is a masterpiece)
        return;
        }

    // .. blah blah

    // the critical 'primer' read command
    [sock readDataToLength:sizeof(CommProt) withTimeout:-1 tag:0];

    // .. blah blah
    }

Не забывайте, что вы должны выполнить следующее чтение в двух местах: (а) при первом подключении и (б), конечно, после каждого чтения!

В этом примере ваш протокол связи будет выглядеть так ...

typedef struct _CommProt        // v.3
    {
    BOOL        pressExplosionButton;
    BOOL        pressFireworksButton;
    float       usersSteering;
    float       usersTemperature;
    float       usersAltitude;
    float       usersAngle;
    }
    CommProt;

Такая переменная, как "getMe" в примере, будет просто выглядеть так:

    CommProt                getMe;
    CommProt                sendMe;

Если вы изо всех сил пытаетесь понять этот тип протокола связи, попробуйте также этот длинный ответ:

Планшет (iPad / Android) - протокол связи с сервером

AsyncSocket невероятно красив, он был написан таинственным Джастином Воссом, который, казалось, ушел из Интернета после того, как подарил его миру - это одна из лучших библиотек, когда-либо написанных, это шедевр.

Надеюсь, поможет.

person Fattie    schedule 18.03.2011
comment
К сожалению, это не очень помогает, возможно, мне придется сделать это совершенно по-другому - если вам нравится рабочий проект, который обменивается данными между MAC и iPhone, я был бы признателен - спасибо! - person user387184; 18.03.2011
comment
Я действительно заблудился - не могу найти ни одного рабочего примера для asyncsocket - поэтому я опубликовал новый более широкий вопрос ... - person user387184; 18.03.2011
comment
Тем временем я установил новый xCode, изменил порт на сервере Mac и на клиенте iPhone - и он внезапно заработал. Большое спасибо за ваш вклад и намеки - это на самом деле привело меня в правильном направлении! - person user387184; 19.03.2011
comment
это одна из лучших когда-либо написанных библиотек, это шедевр. черт возьми, заставляешь меня краснеть - person Donovan Voss; 01.01.2021