IOS 局域网发送信息
基于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 局域网发送信息的更多相关文章
- ios xmpp 发送语音图片解决方案
ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...
- linux上给其他在线用户发送信息(wall, write, talk, mesg)
linux上给其他在线用户发送信息(wall, write, talk, mesg) 2018-01-05 lonskyMR 转自 恶之一眉 修改 微信分享: 设置登录提示 /et ...
- wireshake抓包,飞秋发送信息,python
http://wenku.baidu.com/link?url=Xze_JY8T15pqI9mBLRpTxWF2d6MP-32xb6UwuE6tsUmitRDheJe-Ju87WlDEDBGuI5MF ...
- ios读取通讯录信息
ios读取通讯录信息 (2012-05-22 14:07:11) 标签: ios读取通讯录 it iphone如许app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和Add ...
- 在iOS当中发送电子邮件和短信
iOS实现发送电子邮件的方法很简单,首先导入MessageUI.framework框架,然后代码如下: #import "RPViewController.h" //添加邮件头文件 ...
- 如何通过js给QQ好友发送信息
一般我们在做页面活动的时候可能会碰到点击一个按钮把一些相关的信息通过QQ发送给你的好友,这种信息推送的功能该如何实现呢!下面我来介绍下使用方法! 代码如下: <!DOCTYPE HTML> ...
- 基于nodejs+webSocket的聊天室(实现:加入聊天室、退出聊天室、在线人数、在线列表、发送信息、接收信息)
1 安装 socket.io模块 npm install "socket.io": "latest" 2 app.js相关 ws = require('soc ...
- socket 套接字服务器端和客户端发送信息
import socket import threading host='' port=6889 def cilenThred(conn,addr): print("成功接受客户端{}的连接 ...
- 用socket发送信息在浏览器上显示出来
服务端代码: import socket def main(): sock=socket.socket() sock.bind(('localhost',8089)) sock.listen(5) w ...
随机推荐
- Android入门(五)UI-单位与尺寸、ListView
原文链接:http://www.orlion.ga/453/ 一.单位与尺寸 布局文件中一共有以下单位供选择:px,pt,dp,sp px:是像素,屏幕中可见的最小元素单位. pt:是磅,1磅等于1/ ...
- BOM之window对象
双重角色 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过Javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Glob ...
- 如何利用Direct NFS克隆数据库
CloneDB是Oracle 11.2.0.3推出的一项新特性,它利用的了11g新引入的Direct NFS.它直接利用目标数据库的备份,无需将备份COPY到克隆环境下,使得一个备份可以克隆多个不同用 ...
- 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...
- 深入了解ibatis源码----简单ibatis示例代码
搭建源码环境: 1.创建sql数据库. CREATE TABLE USER_ACCOUNT ( USERID INT(3) NOT NULL AUTO_INCREMENT, USERNAME VARC ...
- C#中使用Oracle存储过程返回结果集
问题: 在MSSQLServer中定义的存储过程可以直接返回一个数据集,如: create procedure sp_getAllEmployees as SELECT * FROM [NORTHWN ...
- 聚合索引(clustered index) / 非聚合索引(nonclustered index)
以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是否 ...
- 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇
在这个WEB API横行的时代,讲WEB Service技术却实显得有些过时了,过时的技术并不代表无用武之地,有些地方也还是可以继续用他的,我之所以会讲解WEB Service,源于我最近面试时被问到 ...
- Linux 小工具学习之(1)——Wget十例[翻译]
在本博文中我们将学习一下wget这个工具.wget可以使用HTTP.HTTPS.和FTP等常见网络协议来从万维网(WWW)获取文件(从它的名字来源也可以看出 World Wide Web Get -& ...
- C# 代码编程规范
1. 类一定要有注释 2. C#代码要用#region包起来,#region之间要留一个且只留一个空行 3. 含义复杂不容易看懂的参数要写注释 4. 方 ...