iOS socket编程(入门)

1.基于 C 的 BSD socket(UNIX系统中通用的网络接口)

感觉BSD socket 最容易理解,最容易入门,最为灵活     但是最难用,尤其对于大型项目

需要导入头文件

#import <sys/socket.h>
#import <netdb.h>

服务器端

    int    listenfd, connfd;
    struct sockaddr_in     servaddr;
    char    buff[4096];
    long     n;
    int i=100;

    //创建 socket
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
        return;
    }

    //初始化ip地址
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8088);//要与客户端请求的端口网址一样

    //绑定 网址端口
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
        return;
    }

    //监听 网址端口
    if( listen(listenfd, 10) == -1){
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
        return;
    }

    //接受服务器传来的数据
    printf("======waiting for client's request======\n");
    while(i>0){
        if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
            printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
            continue;
        }
        n = recv(connfd, buff, MAXLINE, 0);
        buff[n] = '\0';
        printf("recv msg from client: %s\n", buff);
        close(connfd);
    }

    //关闭socket
    close(listenfd);

客户端

-(void)sendDataToServerURL:(NSURL *)url{
    int    sockfd;
    char    sendline[4096];
    struct sockaddr_in    servaddr;
    NSString * host = [url host];

    //创建 socket
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
        return;
    }

    //初始化ip地址
    struct hostent * hostEnt = gethostbyname([host UTF8String]);//根据域名 获取ip信息
    if (NULL == hostEnt) {
        NSLog(@"解析域名失败");
        return;
    }
    struct in_addr * remoteInAddr = (struct in_addr *)hostEnt->h_addr_list[0];

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8088);
    servaddr.sin_addr = *remoteInAddr;

    //链接TCP服务器(根据ip地址)
    if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
        return;
    }

    //发送字符串到TCP服务器
    printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if(send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
        printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
        return;
    }

    //关闭socket
    close(sockfd);
}

2.FCSocket 接口比BSD socket多的多

服务器端和BSD socket有点类似,

客户端的与BSD socket完全不同,使用的是输入输出流。

服务器端

//收到消息监听
static void handleConnect(CFSocketRef sock, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
    NSLog(@"收到信息了");
}
-(void)openFCSocket
{
    //创建 socket
    const CFSocketContext socketCtxt = {0, (__bridge void *)self, NULL, NULL, NULL};
    CFSocketRef  cfSocket = CFSocketCreate(
                                           kCFAllocatorDefault,
                                           PF_INET,
                                           SOCK_STREAM,
                                           IPPROTO_TCP,
                                           kCFSocketAcceptCallBack,
                                           (CFSocketCallBack)handleConnect,//接受信息回调
                                           &socketCtxt);

    if (cfSocket == NULL) {
        NSLog(@"创建Socket失败");
        return;
    }

    //初始化ip地址
    struct sockaddr_in sin;
    memset(&sin, 0, sizeof(sin));
    sin.sin_len = sizeof(sin);
    sin.sin_family = AF_INET; /* Address family */
    sin.sin_port = htons(8088); /* Or a specific port */
    sin.sin_addr.s_addr= INADDR_ANY;

    //绑定 网址端口
    CFDataRef sincfd = CFDataCreate(
                                    kCFAllocatorDefault,
                                    (UInt8 *)&sin,
                                    sizeof(sin));

    if (kCFSocketSuccess != CFSocketSetAddress(cfSocket, sincfd)) {
        NSLog(@"绑定网址端口失败");
    }
    CFRelease(sincfd);

    //将socket加入  run loop
    CFRunLoopSourceRef socketsource = CFSocketCreateRunLoopSource(
                                                                  kCFAllocatorDefault,
                                                                  cfSocket,
                                                                  0);
    CFRunLoopAddSource(
                       CFRunLoopGetCurrent(),
                       socketsource,
                       kCFRunLoopDefaultMode);

}

客户端

    NSString *host = @"127.0.0.1";
    int port = 8088;

    //创建输入 输出流
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef)host,
                                       port, &readStream, &writeStream);
    NSInputStream *inputStream = (__bridge NSInputStream *)readStream;
    NSOutputStream *outputStream = (__bridge NSOutputStream *)writeStream;

    if (inputStream == nil || outputStream == nil) {
        NSLog(@"流创建失败!");
        return ;
    }

    //启动输入 输出流
    [inputStream open];
    [outputStream open];

    //发送数据
    NSData *outgoingDataBuffer =  [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];
    NSInteger writtenBytes = [outputStream write:outgoingDataBuffer.bytes maxLength:outgoingDataBuffer.length];
    if ( writtenBytes == -1 ) {
        NSLog(@"发送失败");
        return;
    }
    NSLog(@"发送成功");

3. CocoaAsyncSocket封装了CFSocket

实现了TCP,UDP,加入异步线程,断开重连,TLS/SSL等等,实际开发中需要实现的的东西。

如果没时间重复造轮子,用这类第三方框架也不错

时间: 2024-08-24 12:36:21

iOS socket编程(入门)的相关文章

IOS socket编程--Asyncsocket

iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写,而且可选超时.你可以调用它读取和写入,它会当完成后告知你 自动的socket接收.如果你调用它接收连接,它将为每个连接启动新的实例,当然,也可以立即关闭这些连接 委托(delegate)支持.错误.连接.接收.完整的读取.完整的写入.进度以及断开连接,都可以通过委托模式调用 基于run loop的,

python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信. type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字). 2. 第二步是将socket绑定到指定地址.这

J2SE快速进阶——Socket编程入门(TCP/UDP)

作品展时,我们的作品 "超级飞聊" 的主打功能就是聊天,包括局域网聊天.外网聊天等,虽然那时是用VB实现的(winsock控件),不过每种编程中的思想还是大同小异的,所以学习Java中的Socket编程时,倍感亲切啊. 概念了解 Socket又称"套接字",用来向网络中的主机发出请求或者应答网络中发出的请求. 文章开头先来简单了解一下TCP与UDP这两个协议: TCP TCP(Transmission Control Protocol传输控制协议)是一种面向连接的.

Linux socket编程入门(1)-TCP服务端

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEFAULT_PORT 8000 #define MAXLINE 4096 int main(int argc, char

iOS socket编程

// // ViewController.m // socket // // Created by emerys on 16/3/2. // Copyright © 2016年 Emerys. All rights reserved. // #import "ViewController.h" #warning 0000前面四位为消息长度,后接消息,最后以#结束 @interface ViewController ()<NSStreamDelegate,UITableViewDa

TCP IO复用 select并发服务端 Linux socket编程入门(3)

在写这段代码的时候,发现很多地方容易弄错.select有可能会出错,返回-1. 比如 int FD_ISSET(int fd,fd_set *fdset); void FD_CLR(int fd,fd_set *fdset); void FD_SET(int fd,fd_set *fdset); void FD_ZERO(int fd,fd_set *fdset); 这里的几个宏都是传入指针,而不是值传递. select函数声明如下: int select(int maxfdp1,fd_set

php socket编程入门

服务端 <?php /** * File name server.php * 服务器端代码 * * @author guisu.huang * @since 2012-04-11 * */ //确保在连接客户端时不会超时 set_time_limit(0); //设置IP和端口号 $address = "127.0.0.1"; $port = 2046; //调试的时候,可以多换端口来测试程序! /** * 创建一个SOCKET * AF_INET=是ipv4 如果用ipv6,则

socket编程入门

1TCP协议 [java] view plain copy import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /* * 1.Tcp协议客户端 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流 输入流可以读取服务端输出流写出的数据 输出流可以写出

python socket编程入门(编写server实例)-乾颐堂

python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信. type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字). 2. 第二步是将socket绑定到指定地址.这