在继发布寻找解析后,我们终于要连接service了
这里用到了之前提到的CFSocketServer类以及BonjourPublishServer类(上篇中提到的 Publishing a Bonjour service)
Publish和implement service 是两个单独的步骤,相互之前并无依存
这个service是用iOS写的
长酱紫,stop btn控制开启和关闭service,下面两个label显而易见,也是BonjourPublishService中两个参数的数值,下面的incoming text就是echo的部分了,和之前提到的echo方法一样,就是收到客户端的信息再返回给客户端相同信息。
#import <UIKit/UIKit.h>
#import "BonjourPublishServices.h"
#define PORT 2007
@interface ViewController : UIViewController{
UILabel *echoText;
IBOutlet UILabel *statusLabel, *serviceNameLabel;
IBOutlet UIButton *serviceButton;
BonjourPublishServices *pubService;
bool serviceStarted;
CFSocketRef sRef;
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(newTextRecieved:) name:@"posttext"
object:nil ] ;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(bonjourStarted:)
name:BONJOURNOTIFICATIONSTART object:nil ] ;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(bonjourStopped:)
name:BONJOURNOTIFICATIONSTOP object:nil ] ;
pubService = [[BonjourPublishServices alloc] init];
serviceStarted = NO;
[NSThread detachNewThreadSelector:@selector(threadStart)
toTarget:self withObject:nil];
}
-(void)threadStart {
CFSocketServer *cf = [[CFSocketServer alloc]
initOnPort:2007];
if (cf.errorCode != NOERROR) {
NSString *str = [NSString stringWithFormat:@"Error
starting server. Error code: %d",cf.errorCode];
[self performSelectorOnMainThread:@selector(setLabelText:) withObject:str waitUntilDone:NO ];
}
}
-(void)setLabelText:(NSString *)str {
[echoText setText:str];
}
-(IBAction)registerService:(id)sender {
if (!serviceStarted){
[pubService startServiceOfType:@"_echo._tcp."
andPort:PORT];
} else {
[pubService stopService];
}}
-(void)bonjourStarted:(NSNotification *)notification {
serviceNameLabel.text = pubService.publishedName;
statusLabel.text = @"Started";
serviceStarted = YES;
serviceButton.titleLabel.text = @"Stop";
}
-(void)bonjourStopped:(NSNotification *)notification {
serviceNameLabel.text = @"";
statusLabel.text = @"Stopped";
serviceStarted = NO;
serviceButton.titleLabel.text = @"Start";
}
-(void)newTextRecieved:(NSNotification *)notification {
[self
performSelectorOnMainThread:@selector(setLabelText:)
withObject:[notification object] waitUntilDone:NO ];
}
虽然原本写了sRef用来确认/辨别 server所在的socket,但是实现部分都没用到,因为这部分没有源码,所以我也不知道
在viewDidLoad中开了个新线程,用来开启echo serve
这里echo server的初始化在ViewDidLoad中,但是publish在start/stop btn中,这是两个互不依赖的步骤,但是,publish前确定 the server is running是一个更明智的做法