利用AsyncUdpSocket实现局域网下的IM(含Demo)

来源:互联网 发布:数码宝贝5 知乎 编辑:程序博客网 时间:2024/06/15 08:16
1、简介

UDP(User Data Protocol,用户数据报协议),是与TCP相对应的协议。

它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。

这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。

(简单了解,Socket、HTTP和TCP、UDP

2、AsyncUdpSocket

AsyncUdpSocket是UDP/IP socket网络库,包装自CFSocket,用于处理UDP的。

它包括基于非阻塞队列的发送接收操作,完整的委托支持,基于runloop,自包含的类,以及支持IPV4和IPV6。

1)首先,下载AsyncUdpSocket
2)AsyncUdpSocket.h、AsyncUdpSocket.m 导入项目中。

这两个文件是支持 ARC 的,若自己项目是不支持ARC,则如下操作,使其在编译时按照ARC条件进行编译:

target -> build phases -> compile sources -> AsyncUdpSocket文件后面加入 -fobjc-arc

编译运行,若报错,则加入CFNetwork.framework 既可。(Xcode早期版本需要加入此框架,后来的貌似不用)

3、项目中使用AsyncUdpSocket

1)首先,建立连接

//建立基于UDP的Socket连接-(void)openUDPServer{//初始化udpself.udpSocket=[[AsyncUdpSocket alloc] initWithDelegate:self];//绑定端口NSError *error = nil;[self.udpSocket bindToPort:SERVER_PORT error:&error];        if (self.isBroadcast) {        [self.udpSocket enableBroadcast:YES error:&error]; // 实现群聊用    }    //启动接收线程[self.udpSocket receiveWithTimeout:-1 tag:0];}


2) 发送数据

 NSData *dt = [message dataUsingEncoding:NSASCIIStringEncoding] ;    BOOL res = NO;    if (self.isBroadcast) {        self.strCurrentUserIP = BROADCAST_IP_2;    }    //开始发送    res = [self.udpSocket sendData:dt                            toHost:self.strCurrentUserIP                              port:SERVER_PORT                       withTimeout:-1                               tag:0];        NSLog(@"send upd complete.");    if (!res) {[self showAlertWhenFaield:@"Send failed"];//发送失败}


3)回调方法

#pragma mark -#pragma mark AsyncUdpSocket Delegate Methods- (void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag{    NSLog(@"dataTag: %d",(NSInteger)tag);    }- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port{        NSLog(@"Receive Data.");//接收到数据回调[self.udpSocket receiveWithTimeout:-1 tag:0];NSString *info=[[NSString alloc] initWithData:data encoding: NSASCIIStringEncoding];    //获取到接收的数据后,自己进行的处理    MessageVO *aVo = [[MessageVO alloc]init];    aVo.strText = info;    aVo.strFromUsername = self.strCurrentUser;    aVo.strFromUserIP = host;    aVo.msgType = MsgType_Receive;    NSString *strTime = [Statics getCurrentTime];    aVo.strTime = strTime;[self.arrayChat addObject:aVo];[self.tabelViewChat reloadData];[self.tabelViewChat scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.arrayChat count]-1 inSection:0]  atScrollPosition:UITableViewScrollPositionBottom  animated:YES];        //已经处理完毕return YES;}- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error{//无法发送时,返回的异常提示信息[self showAlertWhenFaield:[error description]];}- (void)onUdpSocket:(AsyncUdpSocket *)sock didNotReceiveDataWithTag:(long)tag dueToError:(NSError *)error{//无法接收时,返回异常提示信息[self showAlertWhenFaield:[error description]];}

4、效果图 (左边是真机 itouch4,右边是模拟器)


5、源码下载


注:

1、此Demo仅实现了局域网下的即时通信。

2、双方进行通信的前提是在同一个局域网下,请检查IP地址是否符合。(你可以通过手动输入添加IP)

3、在群聊的时候,会出现发送1条信息后,收到2条信息回来的情况,正在研究这种情况是否正常,完了再补充。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 因盗窃罪出狱数额较大还不起怎么办 司法拍卖房原房主拒绝搬离怎么办 wps卡了没反应没有保存怎么办 微信扫描支付环境有风险怎么办 手机安装东西突然要扫描很久怎么办 我惹朋友真的很生气了怎么办 买了保险后又犯杀人罪 保险怎么办 水瓶盖了拧歪了打不开怎么办 刚买的老干妈盖子打不开怎么办? 门冬胰岛素的盖子转不动怎么办 diy做的蝴蝶结上的歪了怎么办 电脑显示电源已接通未充电怎么办 微博账号被锁无法登录怎么办 惠头条登录过两个账号被锁了怎么办 被两个月大的小狗咬破皮了怎么办 阿根廷认证出口声明成分错了怎么办 花盆土里面有白色的虫子怎么办 刚买的月季苗叶子黄了怎么办? 月季新出的芽中间黑了怎么办 龙须的茎被折断了怎么办? 扦插的月季跟部总发黑怎么办 用过皮炎平后的黑印怎么办 兰花现在不管王莽岭了员工怎么办 家里很穷妈妈还不知道省钱怎么办 执业医师电子注册信息弄错了怎么办 开过花后的百合花根怎么办 荔枝吃起来有股保鲜剂的味道怎么办 厂停产不宣布倒闭又不赔钱怎么办 二审判决生效后发现判错了怎么办 应收账款质押后附属的担保怎么办 房子借款合同和抵押合同丢了怎么办 离婚判决不服上诉期限过了怎么办 法院判完执行厅不执行怎么办 民事判决书下来又有新的证据怎么办 民事判决书下来欠钱没钱法院怎么办 法院笔录没看清就签字了怎么办 有人模仿自己笔迹在法院签字怎么办 房屋未签合同中介定金不退怎么办 临时摊位买的东西想退怎么办 租房合同签了房东不想租了怎么办 租房合同签了不想租了怎么办