文档章节

iOS socket服务器和客户端

云上飞飞
 云上飞飞
发布于 2016/06/30 16:29
字数 495
阅读 106
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

// 服务端
int serverSockerId = 0;
- (void)startService {
    serverSockerId = -1;
    ssize_t len = -1;
    socklen_t addrlen;
    char buff[1024];
    struct sockaddr_in ser_addr;

    // 第一步:创建socket
    // 注意,第二个参数是SOCK_DGRAM,因为udp是数据报格式的
    serverSockerId = socket(AF_INET, SOCK_DGRAM, 0);

    if(serverSockerId < 0) {
        NSLog(@"Create server socket fail");
        return;
    }

    addrlen = sizeof(struct sockaddr_in);
    bzero(&ser_addr, addrlen);

    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    ser_addr.sin_port = htons(1024);

    // 第二步:绑定端口号
    if(bind(serverSockerId, (struct sockaddr *)&ser_addr, addrlen) < 0) {
        NSLog(@"server connect socket fail");
        return;
    }

    while (1) {
        bzero(buff, sizeof(buff));

        // 第三步:接收客户端的消息
        len = recvfrom(serverSockerId, buff, sizeof(buff), 0, (struct sockaddr *)&ser_addr, &addrlen);
        // 显示client端的网络地址
        NSLog(@"receive from %s\n", inet_ntoa(ser_addr.sin_addr));

        if (buff[0] == '\0') {
            continue;
        }

        // 从客户端接收到的数据
        NSString *recStr = [NSString stringWithUTF8String:buff];
        NSLog(@"%lu", (unsigned long)recStr.length);
        // 显示客户端发来的字符串
        NSLog(@"recevce:%@", recStr);

        NSString *result = recStr;
        long length = result.length;
        char buffer[1024];
        for (int i = 0; i < length; i++) {
            buffer[i] = (char)[result substringWithRange:NSMakeRange(i, 1)];
        }
        bzero(buffer, length);
        sprintf(buffer, "%s", [result UTF8String]);

        // 将字串返回给client端
        sendto(serverSockerId, buffer, 1024, 0, (struct sockaddr *)&ser_addr, addrlen);
    }
}
- (void)close {
    // 第四步:关闭socket
    close(serverSockerId);
}

// 客户端
 (void)sendMessage:(NSString *)message completionHandler:(void (^)(NSString *string)) handler {
        int clientSocketId;
        ssize_t len;
        socklen_t addrlen;
        struct sockaddr_in client_sockaddr;
        long length = message.length;

        char buffer[1024];
        for (int i = 0; i < length; i++) {
            buffer[i] = (char)[message substringWithRange:NSMakeRange(i, 1)];
        }

        // 第一步:创建Socket
        clientSocketId = socket(AF_INET, SOCK_DGRAM, 0);
        if(clientSocketId < 0) {
            NSLog(@"creat client socket fail\n");
            return;
        }

        addrlen = sizeof(struct sockaddr_in);
        bzero(&client_sockaddr, addrlen);
        client_sockaddr.sin_family = AF_INET;
        client_sockaddr.sin_addr.s_addr = inet_addr("192.168.1.104");
        client_sockaddr.sin_port = htons(1024);

        bzero(buffer, length);
        sprintf(buffer, "%s", [message UTF8String]);

        // 第二步:发送消息到服务端
        // 注意:UDP是面向无连接的,因此不用调用connect()
        // 将字符串传送给server端
        len = sendto(clientSocketId, buffer, 1024, 0, (struct sockaddr *)&client_sockaddr, addrlen);
        
        if (len > 0) {
            NSLog(@"发送成功");
        } else {
            NSLog(@"发送失败");
        }
        // 第三步:接收来自服务端返回的消息
        // 接收server端返回的字符串
        bzero(buffer, sizeof(buffer));
        len = recvfrom(clientSocketId, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_sockaddr, &addrlen);

        // 从服务器接收到的数据
        NSString *recStr =  [NSString stringWithUTF8String:buffer];

            handler(recStr);
        // 第四步:关闭socket
        // 由于是面向无连接的,消息发出处就可以了,不用管它收不收得到,发完就可以关闭了
        close(clientSocketId);

}

 

© 著作权归作者所有

云上飞飞
粉丝 6
博文 131
码字总数 105112
作品 0
黄浦
程序员
私信 提问
OSChina 技术专题之 Swift 苹果全新开发语言

Swift 是苹果新推出的编程语言,专门针对 OS X 和 iOS 的应用开发。Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达式。同时,Swift 更加快速、便利、高效、安全。除此之...

OSC编辑部
2014/11/10
4.3K
4
求大神指点简历

简 历 个人信息 姓 名: xxx 性 别: 男 出生日期: 1990年1月7日 居住地址: 上海 工作年限: 二年 电子邮件: xxxx@163.com 手 机: 186xxxx6859 户 口: 身 高: 婚姻状况: 新疆 175cm ...

尐帥鱼
2013/06/14
875
11
WebRTC 入门教程(四)| iOS 端如何使用 WebRTC

作者:李超,资深音视频工程师,有多年的音视频相关开发经验。 文章首发于 RTC 开发者社区,如遇到开发问题,请点击这里给作者留言。 前言 之前,我已经写过 Android 端如何使用 WebRTC 的文...

声网Agora
07/03
0
0
JPush APNs iOS通知推送支持 badge +1

JPush APNs Notification badge 支持 +1 的功能上线了,这对 iOS 推送通知非常有意义。 大量的 iOS 应用使用 JPush iOS 来推送通知,并且经常有群发的动作,即广播或者Tag推送。 在不支持 ba...

极光推送
2015/01/29
6.6K
2
iOS 端实现1对1音视频实时通话

前言 之前,我已经写过 Android 端实现1对1音视频实时通话 的文章。在那篇文章中,我向大家介绍了在 Android 端是如何使用 WebRTC 进行音视频通话的。今天,我们再来看看 iOS 端1对1音视频实...

音视频直播技术专家
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx反向代理+负载均衡+服务器宕机解决办法

反向代理 作用:保证系统安全,不暴露服务器IP,利用nginx服务器,利用内网ip进行访问,避免出现攻击服务器的情况 启动本地tomact,127.0.0.1:8080可以访问到tomcat管理页面 效果:通过 bbs....

Jack088
5分钟前
1
0
返回IEnumerable 与IQueryable相比 [关闭]

返回IQueryable<T>与IEnumerable<T>之间有什么区别? IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;IEnumerable<Customer> custs = from c i......

技术盛宴
12分钟前
2
0
开放下载 | 《Knative 云原生应用开发指南》开启云原生时代 Serverless 之门

点击下载《Knative 云原生应用开发指南》 自 2018 年 Knative 项目开源后,就得到了广大开发者的密切关注。Knative 在 Kubernetes 之上提供了一套完整的应用 Serverless 编排服务,让应用开发...

阿里巴巴云原生
17分钟前
2
0
解密淘宝推荐实战,打造 “比你还懂你” 的个性化APP

手淘推荐简介 手淘推荐的快速发展源于2014年阿里“All in 无线”战略的提出。在无线时代,手机屏幕变小,用户无法同时浏览多个视窗,交互变得困难,在这样的情况下,手淘借助个性化推荐来提升...

阿里云官方博客
19分钟前
2
0
内核程序中进程的pid,handle,eprocess之间相互转换的方法

在内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开...

simpower
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部