QQ20160623-0.png (141.43 KB, 下载次数: 1736)
下载附件 保存到相册
8 年前 上传
QQ20160623-1.png (218.31 KB, 下载次数: 1711)
// 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]; // 注意:执行延迟的单位是秒哦 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(doSend) userInfo:nil repeats:YES]; [timer fire]; } - (void)doSend { NSString *toServer = [NSString stringWithFormat:@"Hi,我是iOS客户端,我的时间戳 %li",[UDPUtils getTimeStampWithMillisecond_l]]; [[LocalUDPDataSender sharedInstance] send:[CharsetHelper getBytesWithString:toServer]]; } @end
// Copyright (C) 2016 即时通讯网(52im.net)- 即时通讯开发者社区. // All rights reserved. // Created by JackJiang on 16/06/22. #import "LocalUDPSocketProvider.h" #import "GCDAsyncUdpSocket.h" #import "ConfigEntity.h" #import "CompletionDefine.h" @interface LocalUDPSocketProvider () @property (nonatomic, retain) GCDAsyncUdpSocket *localUDPSocket; @property (nonatomic, copy) ConnectionCompletion connectionCompletionOnce_; @end @implementation LocalUDPSocketProvider // 本类的单例对象 static LocalUDPSocketProvider *instance = nil; + (LocalUDPSocketProvider *)sharedInstance { if (instance == nil) instance = [[super allocWithZone:NULL] init]; return instance; } - (GCDAsyncUdpSocket *)initialLocalUDPSocket { NSLog(@"【IMCORE】new GCDAsyncUdpSocket中..."); // ** Setup our socket. self.localUDPSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; // ** START udp socket // 本地绑定端口合法性检查 int port = [ConfigEntity getLocalUdpSendAndListeningPort]; if (port < 0 || port > 65535) port = 0; NSError *error = nil; // 绑定到指定端口(以便收发数据) if (![self.localUDPSocket bindToPort:port error:&error]) { NSLog(@"【IMCORE】localUDPSocket创建时出错,原因是 bindToPort: %@", error); return nil; } // 开启收数据处理 if (![self.localUDPSocket beginReceiving:&error]) { NSLog(@"【IMCORE】localUDPSocket创建时出错,原因是 beginReceiving: %@", error); return nil; } NSLog(@"【IMCORE】localUDPSocket创建已成功完成."); return self.localUDPSocket; } 。。。。。。 - (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext { NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if (msg) NSLog(@"【UDP_SOCKET】【NOTE】>>>>>> 收到服务端的消息: %@", msg); else { NSString *host = nil; uint16_t port = 0; [GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address]; NSLog(@"【UDP_SOCKET】RECV: Unknown message from: %@:%hu", host, port); } } - (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address { NSLog(@"【UDP_SOCKET】成收到的了UDP的connect反馈, isCOnnected?%d", [sock isConnected]); // 连接结果回调 if(self.connectionCompletionOnce_ != nil) self.connectionCompletionOnce_(YES); } - (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError *)error { NSLog(@"【UDP_SOCKET】成收到的了UDP的connect反馈,但连接没有成功, isCOnnected?%d", [sock isConnected]); // 连接结果回调 if(self.connectionCompletionOnce_ != nil) self.connectionCompletionOnce_(NO); } @end
// Copyright (C) 2016 即时通讯网(52im.net)- 即时通讯开发者社区. // All rights reserved. // Created by JackJiang on 16/06/22. #import "LocalUDPDataSender.h" #import "CharsetHelper.h" #import "GCDAsyncUdpSocket.h" #import "LocalUDPSocketProvider.h" #import "ConfigEntity.h" #import "UDPUtils.h" #import "CompletionDefine.h" @implementation LocalUDPDataSender // 本类的单例对象 static LocalUDPDataSender *instance = nil; - (BOOL) send:(NSData *)dataWithBytes { // 获得UDPSocket实例 GCDAsyncUdpSocket *ds = [[LocalUDPSocketProvider sharedInstance] getLocalUDPSocket]; // 确保发送数据开始前,已经进行connect的操作:如果Socket没有“连接”上服务端,尝试“连接”一次 if(ds != nil && ![ds isConnected]) { // 此次数据只在“连接”成功后发出,“连接”成功则会调用此回调block代码 ConnectionCompletion observerBlock = ^(BOOL connectResult) { // 成功建立了UDP连接后就把包发出去 if(connectResult) [UDPUtils sendImpl:ds withData:dataWithBytes]; }; // 调置连接回调 [[LocalUDPSocketProvider sharedInstance] setConnectionObserver:observerBlock]; NSError *connectError = nil; BOOL connectResult = [[LocalUDPSocketProvider sharedInstance] tryConnectToHost:&connectError withSocket:ds completion:observerBlock]; // 如果连接意图没有成功发出则返回错误码 return connectResult; } else return [UDPUtils sendImpl:ds withData:dataWithBytes]; } // 获取本类的单例。使用单例访问本类的所有资源是唯一的合法途径。 + (LocalUDPDataSender *)sharedInstance { if (instance == nil) instance = [[super allocWithZone:NULL] init]; return instance; } @end
QQ20160624-0.png (506.49 KB, 下载次数: 1639)
QQ20160623-3.png (137.74 KB, 下载次数: 1664)
QQ20160623-4.png (156.78 KB, 下载次数: 1639)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:JackJiang 发表于 2020-12-17 20:06 走接口吧,这样更通用,接口可以在更多的场景下使用,而长连接的建立可没那么容易
引用:逍遥红鹰 发表于 2020-12-17 17:37 现在的需求是,创建群聊走同步的或者走接口,安卓的netty客户端可以利用线程锁走同步,iOS的没找到解决办 ...
引用:JackJiang 发表于 2020-12-17 17:17 现在现代一点的库或框架,都是往异步调用发展,GCDAsyncSocket异步挺好的,你为何要用同步
引用:逍遥红鹰 发表于 2020-12-17 16:30 请问楼主,GCDAsyncSocket是实现异步消息的,同步消息的用什么实现?安卓端的CIM,netty可以实现同步消息, ...
引用:Tina 发表于 2019-03-12 14:53 大神,请问现在用MINA做IM项目还值得吗,公司负责人说用MINA做,但是我看您另一篇文章里面都没有提到这个( ...
引用:Jun_X 发表于 2017-12-29 15:27 对于没学过java的来说,server端代码有挑战性
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.218750 second(s), 46 queries , Gzip On.