IOS 局域网发送信息

基于ios 例子WiTap

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

NSNetService  * server = [[NSNetService alloc] initWithDomain:@"local." type:kWiTapBonjourType name:@"Minwei" port:0];
//[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 += 1;
            assert(self.streamOpenCount <= 2);
            // Once both streams are open we hide the picker and the game is on.
            if (self.streamOpenCount == 2) {
                //连接成功
            }
        } 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 <= 0) {
                // 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 =0;
                }
                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 == 0);

    [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 = 0;
}

send 方法

- (void)send:(uint8_t)
{
    NSLog(@"send");
    assert(self.streamOpenCount == 2);
    // 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 = 0;
        NSInteger written = 0;

        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!=0);
            if(written ==-1){
                break;
            }
            else{
                soFar += bytesWritten;
            }
            if (bytesWritten != dataLength) {
                [self setupForNewGame];
                break;
            }

        }while (soFar != dataLength);
    }
}

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

时间: 2024-10-14 01:07:06

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

(插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。

最近 做些准备性得工作和有意思的事情.所以最近做了一个适合ios和android 错误信息捕捉的unity插件. 两个功能,app崩溃也就是闪退 是开发者 很头疼的一件事,还有就是一些莫名得错误 有时候也会困扰着我们.现在,unity已经封装得挺好了,及时出现数组越界,和空对象这样严重得错误也不会崩溃,听着挺好,但是这给开发者带了很多烦恼啊.因为有时候可能出错了 你要跟就不知道 ,在什么地方出得错误啊.所以我们要想办法去解决这个问题. 我们都知道及时app崩溃,其实后台还是在运行得 只不过是 到

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

ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp.因为项目需求需要实现语音和图片的发送.发送语音图片有三种方法.1,xmpp smack.文件传输方式.2,文本流.3,服务器中转.因为项目工期等原因,最终选择了通过服务器中转的方式来实现这些功能,本博客只是用于自己工作的记录,有什么不对的地方欢迎指正.发送语言消息需要和安卓共通,本来预期的方案是选择使用amr格式的音频.这样工作量都压在ios这边.所以和安卓协商后选择使用了mp3格式的音频编码.首先是

ios局域网联机—苹果官方源码之WiTap剖析(一)(二)

http://www.it165.net/pro/html/201204/2094.html http://www.it165.net/pro/html/201204/2165.html 在过去的时间里,我一直在考虑的事情是,我该写一篇什么样的文章呢?之前的两篇文章都是先有问题,然后我才有目的的解决问题,现在我的困扰是,我不知道该写什么了呵呵.因为其实,大多数的问题,只要在网上搜索一下(google远比baidu要强得多),基本上都能找到解决的办法,已经有了许多相关方面的教程或参考资料了,我并不

易语言数字指令编程大全(发送信息代码数据集合)

控件选中并鼠标显示四向箭头: 控件.发送信息(274,61440,0) 控件.发送信息(274,61450,0) 控件最大化: 控件.发送信息(274,61488,0) 参数2在61488-61503都有效 移动控件: 控件.发送信息(274,61449,0) 2.调整控件尺寸 调整左边: 控件.发送信息(274,61441,0) 调整右边: 控件.发送信息(274,61442,0) 调整顶边: 控件.发送信息(274,61451,0) 控件.发送信息(274,61443,0) 左上角调整: 控

微信开发第六篇服务器主动发送信息

上几篇文章基本是介绍有手机客户端触发的事件在先,这种有手机微信客户端触发的请求,咱们的服务器被动响应,这种模式我个人理解为被动发送信息. 但是除此之外我们有时间要让用户推送消息,比如向家长每天发送孩子的作业信息.这就要用到模板消息了 对于模板消息首先要添加 进入模板选择行业之后就要等两天才能用模板消息 能用模板消息之后 根据自己的情况,查看模板选择适用于自己的模板 如果没有可以自己定义 只要微信官方审核通过就可以用(我申请的好像说是7-15天,完成审计,但是好像30分钟就给我发通知说申请成功)

微信开发调试小工具进化→微信用户发送信息模拟器发布!——这标题起真是好数码暴龙的说

直接说正题吧.最近在做微信第三方服务器.在模拟用户发过来的请求方面,网上流传着一个“微信开发调试小工具”,谁做都不知道了.反正我觉得那个东西看起来挺不爽的,因为其信息发送类型不是很全面,于是我就把它反编译过来自己重写一个了. 我复用了它原本项目的一个类和几个方法 .与原版相比,功能改进如下: 1涵盖了迄今为止所有的信息类型和事件类型(具体的参见微信官方文档里面的接收信息节点); 2对于所有参数都有相关的提示信息 3参数的所属范围除了少数外都用groupbox圈了起来,更加直观地看到了各类信息之间

快速的从电脑端发送信息到手机端的方法介绍

我昨天碰到一个场景是这样的,在手机端需要填写自己的所在的部门名称,由于部门名称很长还且还是中英文夹杂的,这时候在手机端输入感到非常麻烦,而在电脑端的是有这个信息,那么怎么才能把这个信息直接发送到手机上使用呢?昨天我使用了QQ的发送到手机功能,完成了这个小动作,确实挺方便.这里我只是举了一个例子,其实在日常生活和工作中,这种情况还是很多的,例如在电脑端: 看到一个好的网址,想发送到手机继续浏览 看到一个好的图片想发送到手机上作为手机屏幕壁纸 看到一段文字,想发送到手机,进而通过短信发给朋友 ...

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

http://wenku.baidu.com/link?url=Xze_JY8T15pqI9mBLRpTxWF2d6MP-32xb6UwuE6tsUmitRDheJe-Ju87WlDEDBGuI5MFyhtBfn4QeKxfq5GVaMnx9O5a3ngQ1f-sMA8LYJa # coding=utf-8 #import socket #udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #udp.connect(('localhost',2

函数TH_POPUP 功能: 向函数入口参数 client , user决定的用户发送信息(信息为入口参数 message 决 定的信息)

. 函数TH_POPUP      功能: 向函数入口参数 client , user决定的用户发送信息(信息为入口参数 message 决            定的信息)      事例﹕ZBC_LSL_017   http://www.uwins.cn/ ERP交流群379113944(验证:来自博客) 微信扫扫二维码加入我们的平台 七夕送女友送母亲---最佳的礼物