iOS and OS X Network Programming Cookbook |Creating an echo server(Bonjour)(下)

11 篇文章 0 订阅

在继发布寻找解析后,我们终于要连接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是一个更明智的做法




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值