美文网首页
socket简单编程(连接、写、读)

socket简单编程(连接、写、读)

作者: AlexLi_ | 来源:发表于2016-06-15 10:51 被阅读105次

    1、连接服务器
    2、监听状态
    3、发送
    4、当Stream 的状态为NSStreamEventHasBytesAvailable 时 接收消息

    注意:

          我是使用 chatsetver.py来测试的 
          #所以端口号是12345 而且消息的指令是msg 登录指令是iam
    

    连接服务器

    
    
    // 1.连接服务器
            /*
             1.端口号
             2.主机
             3.输入输出流(用的是C语言的输入输出流)
             4.连接  CFStreamCreatePairWithSocketToHost(...)
             
             5.将输入输出流转成OC
             6.设置代理
             7.放入运行循环
             8.打开输入输出流
             */
    
    // 2.监听状态
            
    // 3.登录
            /*
                NSString 转成 NSData 类型
                在通过 NSOutputStream 的类方法 write(data.bytes,data.length)
             */
    
    // 4.发送消息
            /*
                NSString 转成 NSData 类型
                在通过 NSOutputStream 的类方法 write(data.bytes,data.length)
             */
    // 5.接收消息
            /*
                建立一个缓冲区 uint8_t buf[1024];
                返回实际装的字节数
                把字节数组转换成NSData
                将data转化成字符串
             */
    
    

    代码

    #连接
    -(void)connect{
        //主机
        NSString *host = @"127.0.0.1";
        //端口号
        int port = 12345;
        //输入输出流(用的是C语言的输入输出流)
        CFReadStreamRef read;
        CFWriteStreamRef write;
        //连接
        CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, &read, &write);
        //将输入输出流转成OC
        inputStream = (__bridge NSInputStream *)(read);
        outputStream = (__bridge NSOutputStream *)(write);
        //设置代理
        inputStream.delegate = self;
        outputStream.delegate = self;
        //放入运行循环
        [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        //打开输入输出流
        [inputStream open];
        [outputStream open];
    }
    
    #代理方法 - 状态监听
    - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
        switch (eventCode) {
            case NSStreamEventOpenCompleted:
                NSLog(@"输入输出流打开完成");
                break;
            case NSStreamEventHasBytesAvailable:
                NSLog(@"有字节可读");
                [self recevisMessage];
                break;
            case NSStreamEventHasSpaceAvailable:
                NSLog(@"可以发送字节");
                break;
            case NSStreamEventErrorOccurred:
                NSLog(@" 连接出现错误");
                break;
            case NSStreamEventEndEncountered:
                NSLog(@"连接结束");
                
                // 关闭输入输出流
                [inputStream close];
                [outputStream close];
                
                // 从主运行循环移除
                [inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
                [outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
                break;
            default:
                break;
        }
    
    }
    
    #登录
    
    -(void)login{
        // 在服务器chatserver.py中  以iam为登录指令, mag 是消息指令  通过  iam 指令  进行登录
        NSString *login = @"iam:Cancer";
        
        NSData *data = [login dataUsingEncoding:NSUTF8StringEncoding];
        
        [outputStream write:data.bytes maxLength:data.length];
    }
    
    #发送消息
    -(void)sendMessage{
        NSString *msg = @"msg:hello!";
        NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];
        
        [outputStream write:data.bytes maxLength:data.length];
    }
    
    #接收消息
    -(void)recevisMessage{
        
        //    建立一个缓冲区 uint8_t buf[1024];
    
        uint8_t buf[1024];
        //    返回实际装的字节数
        
        NSInteger len = [inputStream read:buf maxLength:sizeof(buf)];
        //    把字节数组转换成NSData
        
        NSData *data = [NSData dataWithBytes:buf length:len];
        //    将data转化成字符串
        
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        
        NSLog(@"%@",str);
    }
    
    
    

    相关文章

      网友评论

          本文标题:socket简单编程(连接、写、读)

          本文链接:https://www.haomeiwen.com/subject/uifudttx.html