alun-chen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

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实现客户端/服务器端

 

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

posted on 2016-05-05 15:06  alun-chen  阅读(1385)  评论(0编辑  收藏  举报