我使用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上运行哪些应用来测试? 非常感谢!
答案 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写的,他似乎在把它送到世界后从网上掉了下来 - 它是有史以来最好的图书馆之一,它是一个杰作。
希望它有所帮助。