zoukankan      html  css  js  c++  java
  • IOS Socket 03-建立连接与登录

    1. 搭建python服务器

        这里我们用到python服务器Socket Server。如何运行Server?下面介绍

        1)通过百度云下载文件 http://pan.baidu.com/s/1i5ybxg5

    下载完成文件之后,可以看到倒数第三行的代码,reactor.listenTCP(12345, factory)。 这里可以修改端口号12345。

        2)然后我们运行文件。

    首先,在mac机器上打开终端,在终端上到chatserver.py的文件目录下。然后输入命令:python chatserver.py,按回车。

    可以看到,有‘Iphone Chat server started’的字样。证明服务器已经开启。

    2. 客户端 - 与服务器建立连接与登录

        1)首先建立连接(通过3次握手)

    定义全局变量:

    NSInputStream *_inputStream;  
    NSOutputStream *_outputSteam;

    与服务器建立连接:

    /**IOS实现sokcet连接是通过使用C语言**/    
        
    
    // 1.与服务器通过三次握手建立连接
    ,设置主机(本机)和端口号
    NSString *host = @"127.0.0.1";
    int port = 12345;
    
    // 2.定义输入输出流
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    
    // 3.分配输入输出流的内存空间
     CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
    
    // 4.把C语言的输入输出流转成OC对象
    _inputStream = (__bridge NSInputStream *)readStream;
    _outputSteam = (__bridge NSOutputStream *)(writeStream);
    
    // 5.设置代理,监听数据接收的状态
    _outputSteam.delegate = self;
    _inputStream.delegate = self;
    
    // 把输入输入流添加到主运行循环(RunLoop)
    主运行循环是监听网络状态 
    [_outputSteam scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    
    // 6.打开输入输出流
    [_inputStream open];
    [_outputSteam open];

        2)然后实现delegate

    首先实现NSStreamDelegate,然后实现delegate必须的方法:(代理的回调函数-下面方法,是在主线程中完成的

    -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
        switch (eventCode) {
            case NSStreamEventOpenCompleted:
                NSLog(@"aStream: %@",aStream);
                NSLog(@"成功连接建立,形成输入输出流的传输通道");
                break;
    
            case NSStreamEventHasBytesAvailable:
                NSLog(@"有数据可读");
                //读取数据
                  [self readData];
                break;
    
            case NSStreamEventHasSpaceAvailable:
                NSLog(@"可以发送数据");
                break;
    
            case NSStreamEventErrorOccurred:
                NSLog(@"有错误发生,连接失败");
                break;
    
            case NSStreamEventEndEncountered:
                NSLog(@"正常的断开连接");
                [_inputStream close]; 
                [_outputSteam close];

                [_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
                [_outputSteam removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    break;
    
            default:
                break;
        }
    }

    读取服务器返回的数据:

    #pragma mark 读取服务器返回的数据
    
    -(void)readData{ 
        //定义缓冲区 这个缓冲区只能存储1024字节
        uint8_t buf[1024];
    
       //读取数据
        len为服务器读取到的实际字节数
        NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
    
        // 把缓冲区里的实现字节数转成字符串
        NSString *receiverStr = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding];
        NSLog(@"%@",receiverStr);
    }

        3)上诉实现与服务器连接后,我们发送数据给服务器实现登录

    - (void) loginServer {
        //发送登录请求 使用输出流。 拼接登录的指令 iam:zhangsan
        NSString *loginStr = @"iam:zhangsan";
    
    //uint8_t * 字符数组
        NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
       [_outputSteam write:data.bytes maxLength:data.length];
    }

    查看本文章之前,可以看看

    IOS Socket 02-Socket基础知识

    也可以看下一篇文章

    IOS Socket 04-利用框架CocoaAsyncSocket实现客户端/服务器端

    可以关注本人的公众号,多年经验的原创文章共享给大家。

  • 相关阅读:
    使用Dapper参数化查询(三) IN 查询
    cs窗体继承问题
    SVN使用教程总结(转载)
    celery——使用
    celery——简介及安装
    luffy——django中使用redis
    redis——redis入门(常用数据类型:l )
    redis——redis入门(二)
    redis——redis入门(常用数据类型:string hash)
    redis——redis入门(一)
  • 原文地址:https://www.cnblogs.com/alunchen/p/5461963.html
Copyright © 2011-2022 走看看