程序员人生 网站导航

【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

栏目:综合技术时间:2016-07-19 13:15:49

前言

本文将演示1个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通讯的完全Demo。服务端将分别用MINA2和Netty4进行实现,而通讯时服务端你只需选其1就好了。同时用MINA2和Netty4分别实现服务真个目的,是由于很多人都在纠结究竟是用MINA还是Netty来实现高并发的Java网络通讯服务端,在此干脆两个都实现了,就看你怎样选择了,够吊吧。

NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。这其中最流行的不过就是MINA和Netty了,MINA目前的主要版本是MINA2、而Netty的主要版本是Netty3和Netty4(Netty5已被取消开发了:详见此文),本次将使用MINA2和Netty4来实现服务真个代码。

实际上,MINA2和Netty4的官方代码里已有UDP通讯的Demo代码,但客户端其实不是基于当今流行的移动端(主要是Android和iOS端)来实现,本文将演示用iOS客户端来实现这类跨平台的双向网络通讯。演示Demo中,已解决跨平台通讯时的乱码、数据字节异常等问题,请继续往下浏览。

《NIO框架入门》系列文章

有关MINA和Netty的入门文章很多,但多数都是复制、粘贴的未经证实的来路不明内容,对初次接触的人来讲,1个可以运行且编码规范的Demo,明显要比各种“详解”、“深入分析”之类的要来的直接和成心义。本系列入门文章正是基于此种斟酌而写,虽无精深内容,但最少希望对初次接触MINA、Netty的人有所启发,起到抛砖引玉的作用。

本文是《NIO框架入门》系列文章中的第3篇,目录以下:

  • 《NIO框架入门(1):服务端基于Netty4的UDP双向通讯Demo演示》
  • 《NIO框架入门(2):服务端基于MINA2的UDP双向通讯Demo演示》
  • 《NIO框架入门(3):iOS与MINA2、Netty4的跨平台UDP双向通讯实战》(本文
  • 《NIO框架入门(4):Android与MINA2、Netty4的跨平台UDP双向通讯实战》

本文亮点 

  • 客户端基于iOS移动端平台实现:
    通常这类跨平台的网络通讯例子很难找,本文已解决跨平台通讯的适配问题,是个难得的实践入门示例;
  • 完全可履行源码、方便学习:
    完全的Demo源码,合适新手直接运行,便于学习和研究。
  • Demo中的代码源自作者的开源工程,有实用价值:
    源码均修改自作者的即时通讯开源工程 MobileIMSDK,只是为了方便学习理解而作了简化,有1定的实用价值;

本文Demo的场景逻辑

本文要演示的Demo包括两部份,iOS UDP客户端和NIO框架实现的服务端(包括MINA2和Netty4实现两个方案),客户端每隔5秒向服务端发送消息,而服务端在收到消息后马上回复1条消息给客户端。

如上所述,服务端和客户端都要实现消息的发送和接收,即实现跨平台的双向通讯。如果有心的话,略加改造,也就很容易实现1个简陋的聊天程序了。下节将将给出真实的实现代码。

iOS客户端准备工作

[Step 1] 去Github上下载最新的CocoaAsyncSocket:

CocoaAsyncSocket源码地址:https://github.com/52im/CocoaAsyncSocket,以下图:

补充说明:iOS里的网络编程有多种途径实现(具体请参看此文),本文选择的是iOS里非常热门的 CocoaAsyncSocket 工程,它对iOS原生网络API做了进1步封装,使得开发者更容易使用。

[Step 2] 建好XCode工程,准备开撸:

建好工程后把CocoaAsyncSocket的源码援用进来就好了,以下图:

补充说明:如何新建1个XCode工程请自行百度之,依照系统默许的简单建立1个就行了,本例不需要作额外配置和额外的系统库援用。

iOS客户端代码实现

[1] 客户端主类 ViewController.m:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//  Copyright (C) 2016 即时通讯网(52im.net)- 即时通讯开发者社区.
//  All rights reserved.
//  Created by JackJiang on 16/06/22.
#import "ViewController.h"
#import "LocalUDPSocketProvider.h"
#import "LocalUDPDataSender.h"
#import "CharsetHelper.h"
#import "UDPUtils.h"
  
@interface ViewController ()
@end
  
@implementation ViewController
  
- (void)viewDidLoad
{
    [super viewDidLoad];
      
    // 初始化socket
    [[LocalUDPSocketProvider sharedInstance] initialLocalUDPSocket];
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐