socket初级使用(客户端)

  在国庆这段时间里用零星的一些时间看了一下socket的学习资料,由于笔者偏向学习实用方面的内容,因此此篇文章涉及理论知识较少,主要是以实现思路(怎么做)为主,但在实现之前还是需要了解一些基础的理论知识(如果其中有误请指出)

  TCP是用socket来实现,或者说socket就是对TCP的封装,因此要想明白Socket连接,先要明白TCP连接。

  TCP(传输控制协议)(对应TCP的另一种协议是UDP协议,读者可自行查阅相关资料)

  作用:建立连接,形成传输数据的通道

  特点:在连接中进行大数据传输(数据大小不收限制)

  优点:通过三次握手完成连接,是可靠协议,安全送达(关于三次握手可以用打电话的例子说明)

  劣势:必须建立连接,效率会稍低

  

  通过此图可以看出通信的两端都是Socket,因此网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

  这里不做服务端介绍,主要介绍客户端的实现,以下为实现代码及说明

  

/**          主要实现思路
     *  1.创建主机地址,设置端口号
        2.连接到主机
        3.将c语言输入输出流转化为oc语言并代理
        4.打开输入输出流,并加入消息循环池      最后个根据代理方法来监听输入输出流的变化即可 
     */
    //设置主机地址和端口号根据服务端所给端口号设置
    NSString *host = @"127.0.0.1";
    int port = 12345;
    //创建c语言输入输出流
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    //链接至主机
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
    //将c语言输入输出流转化为oc对象,此处用到定义好的OC全局变量
    _outputStream = (__bridge NSOutputStream *)writeStream;
    _inputStream = (__bridge NSInputStream *)readStream;
    //设置代理
    _outputStream.delegate = self;
    _inputStream.delegate = self;
    //打开输入输出流通道并监听
    [_outputStream open];
    [_inputStream open];
    //加入消息循环池,若不放入消息循环池不能做到监听
    [_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

接下来实现输入输出流的代理方法让我们可以实时监听输入输出流的改变

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
    switch (eventCode) {
        case NSStreamEventOpenCompleted:
//            NSLog(@"%@",[aStream class]);
            NSLog(@"连接到主机完成");
            break;
        case NSStreamEventHasBytesAvailable:
//            NSLog(@"%@",[aStream class]);
            NSLog(@"有字节可读");       //读取对应的字节
            [self readData];
            break;
        case NSStreamEventHasSpaceAvailable:
            NSLog(@"%@",[aStream class]);
            NSLog(@"可发送字节");
            break;
        case NSStreamEventErrorOccurred:
            NSLog(@"链接错误");
            break;
        case NSStreamEventEndEncountered:
            NSLog(@"断开链接");
            //链接断开后需要关闭输出输出流通道并将其移出消息循环池
            [_outputStream close];
            [_inputStream close];
            [_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            [_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            break;
        default:
            break;
    }
}

对应的就有输出数据和输入数据

    //输出数据,此处name需要匹配服务器端输入格式要求
    NSString *name = [@"iam:" stringByAppendingString:@"lisi"];
    //做出对应的转化
    NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding];
    //将数据输出
    [_outputStream write:data.bytes maxLength:data.length];

    //有输出后输入端会监听到接收了新的数据此处就可以直接读取
- (void)readData {
    //设置一个字符数组用于接收字符数据
    uint8_t buff[1024];
    //获取字符数据并得到其长度
    NSUInteger length = [_inputStream read:buff maxLength:sizeof(buff)];
    //将接收的字符数组转化为OC对象
    NSString *receving = [[NSString alloc] initWithBytes:buff length:length encoding:NSUTF8StringEncoding];
    NSLog(@"%@",receving);
}

  从上述代码中可以看出socket的使用方法其实还是较为简单,关键是需要理解到其实现步骤,只要记住了步骤再做出对应的转化就能很好的实现,当然此处只是最简单的socket编程。希望此文对各位有帮助,最后祝大家国庆快乐!

时间: 2024-12-28 21:42:24

socket初级使用(客户端)的相关文章

Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架

GCAsyncSocket 这是一个2003的开发出来的一个开源框架 首先把GCDAsyncSocket的.h和.m文件拖入到工程中 试图控制器遵守GCDAsyncSocketDelegate协议 实例:在页面上有一个简单的textView和textField 在textField中输入文字后,点击发送即可把文字发送到服务器 ,服务器端返回的文字数据会显示到textView上 //  服务器主机ip地址#define kHost @"172.16.3.101"//  服务器主机通信端口

【windows socket+HTTP服务器客户端】

Windows Socket+HTTP服务器客户端 Winsock是 Windows下套接字标准.                 1.HTTP协议:          HTTP是基于客户端/服务器的请求,响应协议.        请求:由客户端向服务器发起,指定了要从服务器获取的资源.请求包含了协议首部,指明了客户端处理能力信息,如可以处理的文件类型,支持的语言,编码方式等.        响应:服务器收到客户端的请求后,解析这个请求,构造响应,并发送给客户端.响应同样包含了协议首部,指明了服

【windows socket+UDP服务器客户端】

Windows Socket+UDP服务器客户端 Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷.相比与TCP,UDP不需要建立连接(不需connect.accept函数),数据发送接收之后,不需要终止连接.基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会有数据的丢失

【windows socket编程+服务器客户端】

Windows Socket编程与服务器客户端示例 Winsock是 Windows下套接字标准. Socket套接字基于计算机网络,提供同一系统上不同进程或由局域网连接在一起的不同机器上的进程间通讯功能.如下图: 套接字通过IP地址,Port端口号标识,通过这个标识可以在整个局域网定位一个套接字,通过套接字进程便可以相互传输数据.如:进程A与进程B之间欲通过套接字通信,首先进程A创建一个有IP地址,端口号唯一标识的套接字,进程B同样创建一个有IP地址,端口号唯一标识的套接字,进程A,B便可以通

socket + pcntl_fork 实现客户端请求,服务器实时监听返回处理 消息推送

<?php /* socket链接整个过程 1,socket_create 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET: 第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM.数据报套接字类型为SOCK_DGRAM.原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部): 第三个参数指定应用程序所使用的通信协议.此参数可以指定单个协议系列中的不同传输协议.在Inter

异步Socket服务器与客户端

本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. Socket连接(Socket Connection) Socket服务(Socket Service) 连接主机(Connection Host) 加密与压缩(Encrypt与Compress) 请求入队(Enqueuing Requests) 确保发送和接收(Ensure send and recie

socket.io获取客户端的IP地址(修正官方1.0.4版本BUG)

之前我有看过别人写的文章,说到如何获取客户端IP地址,代码如下: var io = require("socket.io").listen(server); io.sockets.on("connection", function (socket) { var address = socket.handshake.address; console.log("New connection from " + address.address + &qu

Java 利用 Socket 实现服务器客户端聊天

Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的. 而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能 具体效果看下图: 这只是在本地中试用的效果,如果加上UI界面,其实就可以做成一个聊天的小应用了. 1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待

Socket Android手机客户端与PC服务端局域网内联测试

Socket Android手机客户端与PC服务端局域网内联测试,笔者采用的是 PC服务器,Android平板客户端 ,PC模拟器客户端, 前段时间为了加深对Socket通信的印象和知识的深度掌握,我模仿了QQ的一些元素,也借鉴了其他牛人的一些源码思想,写了 一个 叫 IQ 的 Android 聊天软件,该软件大致由 Android客户端.JAVA pc服务端.mysql数据库组成,客户端和服务端都 比较多的用到了读写的IO流,SCOKET,线程等,这篇博客主要给大家介绍测试环境,不讲源码实现方