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]Slider控件常用方法

    WPF的Slider控件继承自RangeBase类型,同继承自RangeBase的控件还有ProgressBar和ScrollBar,这类控件都是在一定数值范围内表示一个值的用途. 首先注意而Rang ...

  2. 检查Chunksum与Chunk Data之间的缓冲区发送到DataNode节点

    我们会看到左边"iOS Apps"下面有四个选项:"Certificates"."Identifiers"."Devices&qu ...

  3. jQuery - 自定义伪类 [:pseudoclass]

    有两种创建伪类的方法, 第一种, $.extend( $.expr[':'], { // 自定义的伪类名称:group group: function(element, index, matches, ...

  4. 【转载】为什么V8引擎这么快?

    原文地址:http://blog.csdn.net/horkychen/article/details/7761199

  5. js获取倒计时

    <html> <head> <title>出错啦~~~</title> <link href="css/login1.css" ...

  6. JSON 基础解释.

    JSON.(JavaScript Object Notation) JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本 ...

  7. mongodb安装及基础命令

    安装mongodb(mongodb-linux-x86_64-3.2.4.tgz)1 export PATH=$PATH:/usr/local/mongodb/bin2 /usr/local/mong ...

  8. Java学习笔记一——安装JDK并配置环境变量

    下载安装JDK1.8 在官网上下载JDK,官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...

  9. vs2010中的MSBuild输出warning MSB8012问题

    vs2010中,MSBuild与C++编译器无缝整合.无论使用vs2010生成的代码,还是转换vs2008或者是更低版本vs编译的C++代码.都会在工程编译后,都会提示一条错误: C:\Program ...

  10. listView后面加控件,防止被挤

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...