iOS socket 简单使用

关于socket的文章非常多,别人写 的也很清楚,我敲这个demo的时候,也是看着别人的博客一步一步敲的,这样才能发现其中的问题。在这里socket的原理、TCP、http协议就不做介绍了。下面的代码只是实现简单的客户端和服务端的通信,服务端给指定客户端发送消息。当然也可以实现客户端给客户端发送消息,想给谁发送,在消息里加上一个标志,服务端收到时,再简单解析一下就可以了。

因为写博客的时候和学习socket的时候隔的时间有点长,所以参考的文章不知道是哪篇了,就不关联了。微笑

注:代码里面的控件全是在storyboard拖拽出来的

使用socket首先导入这几个头文件

#import <sys/socket.h>

#import <netinet/in.h>

#import <arpa/inet.h>

#import <unistd.h>

#import <netinet/tcp.h>


客户端:

创建一个静态变量

static ClientViewController *selfClass =nil;//c函数里可使用其调自身方法或属性



- (void)viewDidLoad {

    [super viewDidLoad];

    selfClass=self;

    [self creatConnect];

}



/**

 创建连接

 */

-(void)creatConnect{

    

    CFSocketContext sockContext={ 0,NULL, NULL,NULL,NULL};

//    创建socket

     _socket=CFSocketCreate(kCFAllocatorDefault,//为对象分配内存 可为nil

                                       PF_INET,//协议族,0或负数 默认为 PF_INET

                                       SOCK_STREAM,//套接字类型,协议族为PF_INET 默认

                                       IPPROTO_TCP,//套接字协议

                                       kCFSocketConnectCallBack,//触发回调消息类型

                                       TCPServerConnectCallBack ,//回调函数

                                       &sockContext//一个持有CFSocket结构信息的对象,可以为nil

                                       );

    

    if (_socket!=nil) {

//        配置服务器地址

        struct sockaddr_in addr4; //IPV4

        memset(&addr4, 0, sizeof(addr4));

        

        addr4.sin_len=sizeof(addr4);

        addr4.sin_family=AF_INET;//协议族

        addr4.sin_port=htons(8888);//端口号

        addr4.sin_addr.s_addr=inet_addr([@"服务端IP地址" UTF8String]); // 把字符串的地址转换为机器可识别的网络地址

        

        CFDataRef address=CFDataCreate(kCFAllocatorDefault, (UInt8 *)&addr4 , sizeof(addr4));

        //绑定socket

        CFSocketConnectToAddress(_socket, address, -1);// 连接超时时间,如果为负,则不尝试连接,而是把连接放在后台进行,如果_socket消息类型为kCFSocketConnectCallBack,将会在连接成功或失败的时候在后台触发回调函数

        

    

        CFRunLoopRef cRunRef=CFRunLoopGetCurrent();

        

        CFRunLoopSourceRef sourceRef=CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);

        CFRunLoopAddSource(cRunRef, sourceRef, kCFRunLoopCommonModes);

        

//        释放sourceRef

        CFRelease(sourceRef);

    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值