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 = ; // 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[];

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

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

IOS Socket 03-建立连接与登录的更多相关文章

  1. iOS socket原理及连接过程详解

    连接过程图解(度娘的拿过来用)

  2. iOS socket保持后台连接 ios9.0 xcode8.0

    可以保持后台,但申请上架是肯定会被拒的 本教程是基于AsyncSocket库的简单开发! socket机制今天就不说了,毕竟百度上太多太详尽了! 1.先new一个工程: ​2.要写socket的界面遵 ...

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

    这篇文章,我们介绍CocoaAsyncSocket框架的使用,主要介绍实现客户端/服务器端代码,相信在网上已经很多这样的文章了,这里做一下自己的总结.这里介绍使用GCD方式 一.客户端 1.下载地址 ...

  4. IOS Socket 02-Socket基础知识

    1. 简介 Socket就是为网络服务提供的一种机制 通信的两端都是Socket 网络通信其实就是Socket间的通信 数据在两个Socket间通过IO传输 2. Socket通信流程图 3. 模拟Q ...

  5. 浅谈IM软件怎样建立安全socket连接、登录

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  6. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  7. iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

    如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候 ...

  8. [转] iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

      转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可 ...

  9. Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠s ...

随机推荐

  1. wpf 空白汉字占位符

    <TextBlock xml:space="preserve" Text="主  编" />   表示一个汉字占位符

  2. Spring IOC 注入方式

    依赖注入通常有如下两种方式: ①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例. 设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例.这种注入方式简单.直观,因而在S ...

  3. C# Susan边缘检测(Susan Edge Detection)

    Susan边缘检测,方法简单,效率高,具体参照 The SUSAN Edge Detector in Detail, 修改dThreshold值,可以改变检测效果,用参照提供的重心法.力矩法可得到边缘 ...

  4. git 命令大全

    git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...

  5. Memcached服务介绍及安装指南

    一.memcached服务介绍 1.为什么需要memcached服务 A:第一种场景 网站访问大多数情况下都需要查询数据库操作,如果网站的流量很大并且大多数的访问会造成数据库高负荷的状况下,由于大部分 ...

  6. C++中未初始化的bool值的问题

    原创文件,欢迎阅读,禁止转载. 问题描述 你见过一个这样的bool值吗,判断 var 和 !var 都是成立的,今天被我遇到了,是在一个坑里遇到的.今天调试了一个程序,发送一个网络消息,结果总是得不到 ...

  7. win10周年更新后程序各种卡死,进程无法结束怎么破?

    最近THINKPAD T460P更新了WIN10周年版后程序各种卡死,运行一段时间,各种程序就开始崩溃,进程无法结束,最终只能强制关机. 这个BUG微软已经确认了,安装了SSD+HDD双硬盘的WIN1 ...

  8. Jquery中的checkbox 及radio的问题

    在web开发中,我们经常会对checkbox和radio进行读写操作,下面我来分享一下我的项目中的相关案例: 一.checkbox <input id="check1" cl ...

  9. Windows下mysql忘记root密码的解决方法

    1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd窗口,切换到mysql的bin目录,运行命令: mysql ...

  10. Java中的一个类怎么调用另一个类中的方法

    如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...