OC中的socket通信

现在很多客户端和服务器之间的交互都是通过JSON或者XML进行的,但是有时候如果数据量较小,JSON和XML就显得比较冗余

•Socket允许使用长连接,允许应用程序运行在异步模式(提高效率),只有在需要的时候才接收数据

•在iOS中以NSStream(流)来发送和接收数据

•可以设置流的代理,对流状态的变化做出相应

–连接建立

–接收到数据

–连接关闭

1.NSStream:数据流的父类,用于定义抽象特性,例如:打开、关闭代理,NSStream继承自CFStream(Core Foundation)

2.NSInputStream:NSStream的子类,用于读取输入

3.NSOutputStream:NSSTream的子类,用于写输出

下面是开发步骤:

1.网络连接设置

  1).设置网络连接,绑定到主机和端口

  2).设置输入流和输出流的代理,监听数据流的状态

  3).将输入输出流添加至运行循环

  4).打开输入流和输出流

2.发送消息给服务器

3.有可读取字节时,读取服务器返回的内容

4.到达流末尾时,关闭流,同时并从主运行循环中删除

废话不多说,下面我们来尝试使用以下Socket通信

首先定义输入流和输出流(PS.做过java开发的应该对输入输出流不陌生吧)

// 输入流,用来读取服务器返回的字节
NSInputStream *inputStream;
// 输出流,用于给服务器发送字节
NSOutputStream *outputStream;

在OC中使用Socket需要用到CoreFoundation的一些流技术,创建流的时候需要用CFXXX等创建,然后在转换为NSXXX

下面是跟服务器建建立链接的方法

// 建立与服务器的连接
-(void)connectToServer:(NSString *)host port:(NSInteger)port{

    // 创建CF下的读入流
    CFReadStreamRef readStream;
    // 创建CF下的写出流
    CFWriteStreamRef writeStream;

    // 创建流
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)(host), port, &readStream, &writeStream);

    // 将CFXXX流和NSXXX流建立对应关系
    inputStream = (__bridge NSInputStream *)(readStream);
    outputStream = (__bridge NSOutputStream *)(writeStream);

    // 设置通信过程中的代理
    inputStream.delegate = self;
    outputStream.delegate = self;

    // 将流对象添加到主运行循环(如果不加到主循环,Socket流是不会工作的)
    [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    // 打开流
    [inputStream open];
    [outputStream open];
}

然后让你的类遵守NSStreamDelegate协议

并且实现下面的方法进行监听

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
    NSLog(@"%u",eventCode);

    switch (eventCode) {
        case NSStreamEventOpenCompleted:
            NSLog(@"连接完成");
            break;
        case NSStreamEventHasBytesAvailable:
        {NSLog(@"有刻度字节");
            uint8_t buffer[10];
            NSMutableString *mstr = [NSMutableString string];
            int len;// = [inputStream read:buffer maxLength:sizeof(buffer)];
            do{
                len =  [inputStream read:buffer maxLength:sizeof(buffer)];
                NSString *s = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
                [mstr appendString:s];
            }while (len == sizeof(buffer));

            NSLog(@"====%@====",mstr);
        }
            break;
        case NSStreamEventHasSpaceAvailable:
            NSLog(@"可以写入数据");
            break;
        case NSStreamEventErrorOccurred:
            NSLog(@"发生错误");
            break;
        case NSStreamEventEndEncountered:
            NSLog(@"流结束");
            // 做善后工作
            // 关闭流的同时,将流从主运行循环中删除
            [aStream close];
            [aStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        default:
            break;
    }

}

调用connect方法后控制台就会打印出连接完成,可以写入数据,此时就可以写入数据了,下面是写入数据的代码

 NSString *str = @"iam:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk12345";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [outputStream write:data.bytes maxLength:data.length];
    

因为Socket传输的都是二进制流,所以当传输字符串时需要通过NSData转为二进制数据

此外要记得流关闭的时候要从主循环中移除

一般我们开发的时候不会用原生的socket,一般都是用第三方的框架,这样可以提高开发效率,减少开发过程中出现错误

如果使用的是TCP协议一般用AsyncUdpSocket如果使用的是UPD一般使用asyncUdpSockey

http://pan.baidu.com/s/1gdDuGIf

上面的地址中有我的demo和一个python写的服务脚本,,只需要在你的终端里面输入 python+空格+那个py文件就运行起来了.这个文件运行起来以后你的电脑就是一台服务器了,,连接服务器的代码里面host传127.0.0.1   port传12345就可以建立连接了

OC中的socket通信

时间: 2024-09-29 08:11:42

OC中的socket通信的相关文章

python中的socket通信

协议的概念 不同的国家说不同的语言人门想沟通就需要用英语,只要有一种大家都认可都遵守的协议即可,这种方式在计算机上要遵守的网络通信协议叫做TCP/IP协议早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的网络协议,互不兼容为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准.因为互联网协议包含了上百种协议标准,但是最重要的两个

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用. TCP/IP是个协议组,它分为三个层次:网络层.传输层和应用层: 网络层包括:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 传输层包括:TCP协议.UDP协议. 应用层包括:HT

Android中的socket通信

用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java package com.example.driverexam; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter

Java中的Socket通信(一)Socket介绍

Socket又称"套接字",应用程序通常通过"套接字"向网络中发出请求或者应答网络请求. 在Java中,Socket和ServeSocket类库位于Java.net包中.SeverSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同的级别.不管是Socket还是ServerSocket它

Java中的Socket通信(二)ServerSocket的建立与使用

在Eclipse当中创建一个Java项目TestMyServerSocket package com.yeqc.testmyserversocket.main; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JOptionPane; public class MyserverSocket { public static void main(S

Java与C之间的socket通信

最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少,而且后台服务器已经采用原始socket实现与c客户端通信,这就要求Android客户端也采用socket实现.所以在开发Android app时采用了原始socket进行编程. 由于算法是用C语言实现的,而Android应用一般是Java开发,这就不可避免得涉及Java和C语言之间的通信问题.一种

Android中的常见通信机制和Linux中的通信机制

Handler Handler是Android系统中的一种消息传递机制,起作用是应对多线程场景.将A进程的消息传递给B线程,实现异步消息处理.很多情况是将工作线程中需要更新UI的操作消息传递给UI主线程,而实现更新UI操作. 因为工作线程和主线程是共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程和主线程直接使用该对象,只需要注意多线程的同步问题.工作系统通过mHandler向其成员变量MessageQueue中添加Message,而主线程一直处于loop中

.net平台下C#socket通信(中)

本文主要讲述: 1.正常通信中握手建立 2.一对多的通信 3.发送接收数据格式转换 4.资源释放 5.开启并保持服务监听 1.握手建立正常的通信通道 项目需要通信的双方(假设是一个上位机.一个下位机)之间需要建立一个稳定的通道,以便进行通信.本项目中具体操作是:上位机作为服务器,下位机作为客户端,同时制定通信协议.上位机首先打开监听等待建立通道,下位机主动连接上位机后发送连接成功的信息到上位机,上位机根据通信协议发送数据到下位机,此时通道已经建立.但为了保险起见(同时遵循三次握手),客户端再次发

Socket通信中AF_INET 和 AF_UNIX域的区别

转载:http://blog.csdn.net/sandware/article/details/40923491 1.  AF_INET域socket通信过程 典型的TCP/IP四层模型的通信过程. 发送方.接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,经过Internet,可以根据此IP端口最终找到接收方:接收数据时,可以从数据包中获取到发送方的IP端口. 发送方通过系统调用send()将原始数据发送到操作系统内核缓冲区中.内核