同步上的writeData总是在iPhone上阻塞

时间:2011-03-18 11:40:51

标签: iphone sockets tcp communication asyncsocket

我使用asyncsocket示例作为起点来了解有关iPhone上的wlan通信的更多信息。

在Mac上,我启动一个示例服务器打开端口0.这样可行,因为我可以在mac上运行测试客户端来编写数据。

在iPhone上我认为我设法连接,因为“流连接”返回YES。

然后我想用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");

[window addSubview:viewController.view]; [window makeKeyAndVisible]; 返回YES; }

它永远不会继续发送数据,writeData总是阻塞。 IP 192.168.0.30是我Mac的IP。我刚刚按照您的建议使用了任何端口12345。

但我真的不知道我要在Mac上做什么才能接收?

正如你所看到的,我实际上使用了syncsocket,然后阻止了它。

我也试过asyncSocket,然后我在asyncsocket类中得到消息:writeStream不能接受字节

也许是因为我没有正确设置Mac,即我需要在Mac上运行哪些应用来测试? 非常感谢!

1 个答案:

答案 0 :(得分:2)

对于它的价值,这是你通常使用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
    }

不要忘记你必须在两个地方滚动下一次阅读,(a)你第一次连接时,(b)当然,每次阅读后!

在示例中,您的通信协议将如下所示......

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

示例中的“getMe”变量看起来像这样:

    CommProt                getMe;
    CommProt                sendMe;

如果您正在努力理解这种类型的通信协议,请尝试这个长答案:

Tablet(iPad/Android)-Server Communication Protocol

AsyncSocket令人难以置信的美丽,它是由神秘的Justin Voss写的,他似乎在把它送到世界后从网上掉了下来 - 它是有史以来最好的图书馆之一,它是一个杰作。

希望它有所帮助。