基于ios 例子WiTap

1.创建本地的服务并设置监听时间检测是否有设备连接。

NSNetService  * server = [[NSNetService alloc] initWithDomain:@"local." type:kWiTapBonjourType name:@"Minwei" port:];
//[UIDevice currentDevice].name
if(self.server != nil) {
  [self.server setDelegate:self];
  //self.server.includesPeerToPeer = YES;
  [self.server publishWithOptions:NSNetServiceListenForConnections];
  [self.server scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSRunLoopCommonModes];
  //[self.server publish];
}

2.创建本地的客户端搜索服务。

testServiceBrowser = [[NSNetServiceBrowser alloc] init];
[testServiceBrowser setDelegate:self];
//testServiceBrowser.includesPeerToPeer = YES;
[testServiceBrowser searchForServicesOfType:kWiTapBonjourType inDomain:@"local"];

3当查找到服务的时候会调用以下方法,寻找和移除来确定局域网里面有多少个IP连接上。

- (void)netServiceBrowser:(NSNetServiceBrowser *)browser didRemoveService:(NSNetService *)service moreComing:(BOOL)moreComing
{
//[netService removeObject:service];
if(!moreComing){
NSLog(@"remove");
[netServices removeObject:service];
}
} - (void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing
{
// Only update the UI once we get the no-more-coming indication.
//[netService addObject:service];
if(!moreComing){
NSLog(@"find");
[service setDelegate:self];
[netServices addObject:service];
//[service resolveWithTimeout:5.0];
}
}

4.通过打开NSInputStream和NSOutputStream来进行对第一个配对上的用户进行连接

BOOL success;
NSInputStream * inStream;
NSOutputStream * outStream;
success = [service getInputStream:&inStream outputStream:&outStream];
if ( ! success ) {
  //进行重新连接
} else {
  self.inputStream = inStream;
  self.outputStream = outStream;   [self openStreams];
}
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
#pragma unused(stream) switch(eventCode) { case NSStreamEventOpenCompleted: {
self.streamOpenCount += ;
assert(self.streamOpenCount <= );
// Once both streams are open we hide the picker and the game is on.
if (self.streamOpenCount == ) {
//连接成功
}
} break; case NSStreamEventHasSpaceAvailable: {
assert(stream == self.outputStream);
// do nothing
} break; case NSStreamEventHasBytesAvailable: {
       //回调信息成功
uint8_t b;
NSInteger bytesRead;
assert(stream == self.inputStream);
bytesRead = [self.inputStream read:&b maxLength:sizeof(uint8_t)];
if (bytesRead <= ) {
// Do nothing; we'll handle EOF and error in the
// NSStreamEventEndEncountered and NSStreamEventErrorOccurred case,
// respectively.
} else {
if(b!='#'){
passMessage[inum] = b;
inum++;
}
else{
printf("%s", (char *)passMessage);
NSString *result = [NSString stringWithCString:(char *)passMessage encoding:NSUTF8StringEncoding];
NSLog(@"%@", result);
inum =;
}
return;
}
} break; default:
assert(NO);
// fall through
case NSStreamEventErrorOccurred:
// fall through
case NSStreamEventEndEncountered: {//重新查询链接
} break;
}
}

附 openStreams ,closeStreams和发送信息

- (void)openStreams
{
assert(self.inputStream != nil); // streams must exist but aren't open
assert(self.outputStream != nil);
assert(self.streamOpenCount == ); [self.inputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open]; [self.outputStream setDelegate:self];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream open];
} - (void)closeStreams
{
assert( (self.inputStream != nil) == (self.outputStream != nil) ); // should either have both or neither
if (self.inputStream != nil) {
[self.inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream close];
self.inputStream = nil; [self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream close];
self.outputStream = nil;
}
self.streamOpenCount = ;
}

send 方法

- (void)send:(uint8_t)
{
NSLog(@"send");
assert(self.streamOpenCount == );
// Only write to the stream if it has space available, otherwise we might block.
// In a real app you have to handle this case properly but in this sample code it's
// OK to ignore it; if the stream stops transferring data the user is going to have
// to tap a lot before we fill up our stream buffer (-: if ( [self.outputStream hasSpaceAvailable] ) { NSInteger bytesWritten;
NSUInteger dataLength; NSUInteger soFar = ;
NSInteger written = ; NSData * data = [@"qwertitiww#" dataUsingEncoding:NSUTF8StringEncoding];
const uint8_t * m = (Byte*)[data bytes];
dataLength = [data length]; do{ bytesWritten = [self.outputStream write:&m[soFar] maxLength:dataLength - soFar];
assert(bytesWritten!=);
if(written ==-){
break;
}
else{
soFar += bytesWritten;
}
if (bytesWritten != dataLength) {
[self setupForNewGame];
break;
} }while (soFar != dataLength);
}
}

由于传输只能接受uint8_t所以需要传送一个bytes来传送字符串  在最后#号是结束符来区分时候传送完一个信息

IOS 局域网发送信息的更多相关文章

  1. ios xmpp 发送语音图片解决方案

    ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...

  2. linux上给其他在线用户发送信息(wall, write, talk, mesg)

        linux上给其他在线用户发送信息(wall, write, talk, mesg)   2018-01-05 lonskyMR 转自 恶之一眉 修改 微信分享: 设置登录提示     /et ...

  3. wireshake抓包,飞秋发送信息,python

    http://wenku.baidu.com/link?url=Xze_JY8T15pqI9mBLRpTxWF2d6MP-32xb6UwuE6tsUmitRDheJe-Ju87WlDEDBGuI5MF ...

  4. ios读取通讯录信息

    ios读取通讯录信息 (2012-05-22 14:07:11) 标签: ios读取通讯录 it   iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和Add ...

  5. 在iOS当中发送电子邮件和短信

    iOS实现发送电子邮件的方法很简单,首先导入MessageUI.framework框架,然后代码如下: #import "RPViewController.h" //添加邮件头文件 ...

  6. 如何通过js给QQ好友发送信息

    一般我们在做页面活动的时候可能会碰到点击一个按钮把一些相关的信息通过QQ发送给你的好友,这种信息推送的功能该如何实现呢!下面我来介绍下使用方法! 代码如下: <!DOCTYPE HTML> ...

  7. 基于nodejs+webSocket的聊天室(实现:加入聊天室、退出聊天室、在线人数、在线列表、发送信息、接收信息)

    1  安装 socket.io模块 npm install "socket.io": "latest" 2 app.js相关 ws = require('soc ...

  8. socket 套接字服务器端和客户端发送信息

    import socket import threading host='' port=6889 def cilenThred(conn,addr): print("成功接受客户端{}的连接 ...

  9. 用socket发送信息在浏览器上显示出来

    服务端代码: import socket def main(): sock=socket.socket() sock.bind(('localhost',8089)) sock.listen(5) w ...

随机推荐

  1. 后端码农谈前端(CSS篇)第七课:定位与浮动

    一.定位: 1.定位的理解 (1)相对定位 相对定位是一个非常容易掌握的概念.如果对一个元素进行相对定位,它将出现在它所在的位置上.然后,可以通过设置垂直或水平位置,让这个元素"相对于&qu ...

  2. backbone库学习-model

    backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...

  3. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  4. [OpenCV] Samples 03: cout_mat

    操作Mat元素时:I.at<double>(1,1) = CV_PI; /* * * cvout_sample just demonstrates the serial out capab ...

  5. 实用js代码大全

    实用js代码大全 //过滤数字 <input type=text onkeypress="return event.keyCode>=48&&event.keyC ...

  6. Java线程面试题 Top 50 (转载)

    转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html   本文由 ...

  7. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

  8. sticky组件的改进实现

    上上篇博客介绍了一个sticky组件的简洁实现,经过这两天的思考,发现上次提供的实现还有较多不足的地方,另外跟别的网站上实现的效果在取消固定的时候也有一些不同,上次提供的取消固定的处理方式不好,本文在 ...

  9. 一对多关系domain Model中设置使用AutoMapper时出错

    在使用AutoMapper时,把数据从VO-PO时显示如下错误,错误提示说在一对多关系中已将集合设置为EntityCollection,那么这个是为什么呢. 看下action中的代码,我们可以发现这是 ...

  10. EDNS

    随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671中提出了一种扩展DNS机制EDNS(Extension Mec ...