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. 遍历指定目录下指定类型文件的函数(fatkun Fix版)

    // ================================================================ // 遍历某个文件夹及子文件夹下某种文件, // 使用说明 // ...

  2. Busybox下tftp命令使用详解

    http://blog.chinaunix.net/uid-375398-id-1991686.html Busybox下的tftp命令可以用来进行单文件传输.使用的时候,是把电脑作为服务器Serve ...

  3. echarts异步加载柱状图遇到的错误- Error: Component series. not exists. Load it first.

    今天看了下echarts教程之中的异步加载柱状图,我按照教程中的代码敲出来之后再运行,就报了一个 Error: Component series. not exists. Load it first. ...

  4. Swift - mutating关键字的使用

    转载自:http://www.jianshu.com/p/14cc9d30770a  感谢作者:此ID想了很久 Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用 ...

  5. SQL事物隔离级别

    标准SQL定义了4个隔离级别 Read uncommitted 未提交读 Read committed 已提交读 Repeatable read 可重复读 Serializable 可序列化 基本语法 ...

  6. 解决Get请求的长度限制

    错误提示: HTTP Error 404.15 - Not Found The request filtering module is configured to deny a request whe ...

  7. CodeForces 743C Vladik and fractions (数论)

    题意:给定n,求三个不同的数满足,2/n = 1/x + 1/y + 1/z. 析:首先1是没有解的,然后其他解都可以这样来表示 1/n, 1/(n+1), 1/(n*(n+1)),这三个解. 代码如 ...

  8. H5、CSS3属性的支持性以及flex

    一.项目中用到一个flex属性,但是应用了flex的父容器只设置了width,没有设置height,此时每一个应用了上面提到的属性的样式的div都重叠在了一起,在IE10,IE11出问题,IE9没有问 ...

  9. java 实现多个文件的Zip包的生成

    最近在项目中遇到多个文件的达成Zip包,由于对这块不熟,在网上找到一个,现在忘了找的谁的,如果您发现了,请告诉我你的链接,我指明出处 下面是相关代码: package run.utils; impor ...

  10. Spring 学习笔记 2. 尚硅谷_佟刚_Spring_IOC&DI概述

    1,远古时代 这里讲述的IOC的演变历史,举一个例子,假如需要生成HTML和PDF格式的报表,以前的开发方式就是有个报表服务类需要使用报表生成器 它需要和其他三个都关联,它既需要知道接口类型,也需要知 ...