0

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

在 Mac 上,我启动了一个打开端口 0 的示例服务器。这很有效,因为我可以使用在 mac 上运行的测试客户端写入数据。

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

然后我想用同步套接字发送数据:(带有完整代码的编辑版本)

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");

[窗口添加子视图:viewController.view];[窗口 makeKeyAndVisible]; 返回是;}

它永远不会继续发送数据,writeData 总是阻塞。IP 192.168.0.30 是我 Mac 的 IP。正如您上面建议的那样,我现在只是使用了任何端口 12345。

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

如您所见,我实际上使用了syncsocket,然后它阻塞了。

我也尝试了 asyncSocket,然后我在 asyncsocket 类中得到消息:writeStream Can NOT Accept Bytes

也许是我没有正确设置Mac,即我需要在Mac上运行什么应用程序来测试?多谢!

4

1 回答 1

3

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

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

平板电脑(iPad/Android)-服务器通讯协议

AsyncSocket 非常漂亮,它是由神秘的 Justin Voss 编写的,他在将其提供给世界后似乎从互联网上掉了下来——它是有史以来最好的库之一,它是一部杰作。

希望能帮助到你。

于 2011-03-18T12:38:58.457 回答