基于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. 【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.N ...

  2. 理解Docker容器的进程管理

    摘要: Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患.另外Docker鼓励"一个容器一个进程(one process per container)&qu ...

  3. CSS 魔法系列:纯 CSS 绘制图形(心形、六边形等)

    <CSS 魔法系列>继续给大家带来 CSS 在网页中以及图形绘制中的使用.这篇文章给大家带来的是纯 CSS 绘制五角星.六角形.五边形.六边形.心形等等. 我们的网页因为 CSS 而呈现千 ...

  4. 两种读写配置文件的方案(app.config与web.config通用)

    第一种方法:采用MS现有的ConfigurationManager来进行读写 using System.Configuration; namespace Zwj.TEMS.Common { publi ...

  5. 解决在IE中获取数据的缓存问题,运行环境为node.js

    IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,url是uri(统一资源定位符)的实例,url就是资源的标识符. 写一个demo进行验证,测试环境:IE8,node.j ...

  6. EasyUI使用tree方法生成树形结构加载两次的问题

    html代码中利用class声明了easyui-tree,导致easyUI解析class代码的时候先解析class声明中的easyui-tree这样组件就请求了一次url:然后又调用js初始化代码请求 ...

  7. 转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案

    转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案 近乎(英文:Spacebuilder),作为.net领域的SNS社区建站系统代表之一,一直在技术开发领域算是兢兢业业,在Discuz!和Php ...

  8. 背水一战 Windows 10 (1) - C# 6.0 新特性

    [源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...

  9. 【Java每日一题】20161208

    package Dec2016; import java.util.List; public class Ques1208 { public static void add(List<? ext ...

  10. mysql中,ENCODE警告---Warning Code : 1287

    mysql中,ENCODE警告 共 1 行受到影响, 1 个警告 执行耗时 : 0.072 sec传送时间 : 0.001 sec总耗时 : 0.073 sec Warning Code : 1287 ...