writeData в syncsocket всегда блокируется на iPhone - PullRequest
0 голосов
/ 18 марта 2011

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

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

На iPhone, мне кажется, мне удалось подключиться, так как «streams connected» возвращает YES.

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

</p>

<p>import "InterfaceTestAppDelegate.h"
import "InterfaceTestViewController.h"
import "AsyncSocket.h"
import "SyncSocket.h"</p>

<p>@implementation InterfaceTestAppDelegate</p>

<p>@synthesize window;
@synthesize viewController;</p>

<ul>
<li><p>(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)remoteHost port:(UInt16)remotePort
{
NSLog(@"Socket is connected!");</p>

<p>NSLog(@"Remote Address: %@:%hu", remoteHost, remotePort);</p>

<p>NSString *localHost = [sock localHost];
UInt16 localPort = [sock localPort];</p>

<p>NSLog(@"Local Address: %@:%hu", localHost, localPort);
}</p></li>
<li><p>(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"application:didFinishLaunchingWithOptions:");</p>

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

<pre><code>        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 (@ "Ошибка подключения syncSocket:");} NSData * data = [@ "testxyz" dataUsingEncoding: NSUTF8StringEncoding];

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

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

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

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

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

Я также попробовал asyncSocket, затем я получаю сообщение в классе asyncsocket: writeStream НЕ МОЖЕТ принимать байты

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

1 Ответ

2 голосов
/ 18 марта 2011

Для чего это стоит, именно так вы обычно читаете некоторые данные, используя 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!
    }

Конечно, вы бы ранее выполнили первую команду чтения "primer":

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

-(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 невероятно красив, он был написан загадочным Джастином Воссом, который, казалось, бросил Интернет после того, как подарил его миру - это одна из лучших когда-либо написанных библиотек, это шедевр.

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

...