ios 接收 c# socket udp 组播
最近用wcf 服务 给ios和安卓做接口,做了几个ios的项目 用udp 组播 让ios多终端接收和刷新方法
做一个简单的小例子会把工程给大家下载的
c#代码:netSocketUDP.rar
ios代码:MyIOSSocketDemo.rar
先用c#做发送
组播IP范围为 224.0.0.0~239.255.255.255
建一个控制台应用程序
private static IPAddress GropuAddress = IPAddress.Parse("224.0.0.2");//IP
private static int GrupPort = 12001;//端口
static void Main(string[] args)
{
for (int i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(3000);//等待3秒再发
Send("sendMessage"+i.ToString()+"个!");
}
}
public static void Send(string message)
{
//不在一个网段也可以收到
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 12002); IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("224.0.0.2"), 12001); server.Bind(iep);
byte[] data = Encoding.ASCII.GetBytes(message); server.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.100.0.1"))); server.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.MulticastTimeToLive, 50); server.SendTo(data, iep2); server.Close();
}
顺便把c#接收也说一下(这个可以不用看,因为我们要做的是ios接收)
static void Main(string[] args)
{
StartListener();
Console.ReadLine();
}
private static void StartListener()
{
byte[] b = new byte[10240];
try
{
while (true)
{
System.Threading.Thread.Sleep(500);
String multiAddress = "224.0.0.2";//Datagrams.getMultiIPAddress("192.168.2.106");
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 12001);
s.Bind(ipep);
IPAddress ip = IPAddress.Parse(multiAddress);
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
new MulticastOption(ip, IPAddress.Any));
s.ReceiveTimeout = 5000;
s.Receive(b);
string sss = System.Text.Encoding.UTF8.GetString(b).Replace(" ", "").Trim();
Console.WriteLine(sss);
s.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("receive multicast exception:" + ex.ToString());
}
}
ios接收
ios 用到的一个类库AsyncUdpSocket 这个类库就是发送和接收收 组播的 用起来很方便网上有好多例子我就简单说一下
建一个Single View Application
把AsyncUdpSocket.h 和AsyncUdpSocket.m加到工程里
窗体上放一个文本显示收到的信息
在ViewController.h里加入
#import "AsyncUdpSocket.h"@interface ViewController : UIViewController<AsyncUdpSocketDelegate>
@property (strong, nonatomic) IBOutlet UITextField *MyResaveTxt;//页面上的文本
@property (nonatomic,strong) AsyncUdpSocket *udpSocket;
-(void)openUDPServer;
在ViewController.m 里实现
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize udpSocket,MyResaveTxt;
- (void)viewDidLoad
{
[super viewDidLoad];
[self openUDPServer];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void) openUDPServer
{
//初始化udp
AsyncUdpSocket *tempSocket=[[AsyncUdpSocket alloc] initWithDelegate:self];
self.udpSocket=tempSocket;
//绑定端口
NSError *error = nil;
[self.udpSocket bindToPort:12001 error:&error];
//发送广播设置
[self.udpSocket enableBroadcast:YES error:&error];
//加入群里,能接收到群里其他客户端的消息
[self.udpSocket joinMulticastGroup:@"224.0.0.2" error:&error];
//启动接收线程
[self.udpSocket receiveWithTimeout:-1 tag:0];
}
//接收
-(BOOL) onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
NSString * info=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
MyResaveTxt.text=info;
[self.udpSocket receiveWithTimeout:-1 tag:0];//启动接收线程
return YES;
}
@end
c#代码:netSocketUDP.rar
ios代码:MyIOSSocketDemo.rar
补一下发汉字会有乱码
c#用
byte[] data =System.Text.Encoding.Default.GetBytes(message);
ios用
NSStringEncoding strEncode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString * info=[[NSString alloc] initWithData:data encoding:strEncode ];
ios URL中文转码
方法1
NSString *url =@"www.haha.com/这是中文";
NSStringEncoding chineseEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
url = [url stringByAddingPercentEscapesUsingEncoding:chineseEncoding];
NSLog(@"%@",url);
NSMutableURLRequest *request = [[NSMutableURLRequestalloc] init];
// 设置URL
[request setURL:[NSURL URLWithString:url]];
// 设置HTTP方法
[request setHTTPMethod:@"GET"];
// 发送同步请求, 这里得returnData就是返回得数据
NSData *data = [NSURLConnectionsendSynchronousRequest:request
returningResponse:nil error:nil];
方法2
- (NSString *)URLEncodedString
{
NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)self,NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8);
[result autorelease];
return result;
}
- 分布式文件系统FastDFS如何做到高可用
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
- SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
- 分布式监控系统Zabbix3.2对数据库的连接数预警
- 分布式监控系统Zabbix3.2监控数据库的连接数
- 分布式监控系统Zabbix3.2给异常添加邮件报警
- 分布式监控系统Zabbix3.2跳坑指南
- 一图看懂java内存模型
- 零代码如何打造自己的实时监控预警系统
- 一步一步在Windows中使用MyCat负载均衡 上篇
- 你真的会玩SQL吗?之逻辑查询处理阶段
- javascript中如何正确将日期(Date)字符串转换为日期(Date)对象?
- 全面迎接.Net3.0时代的到来(WCF/WF/WPF/LINQ)
- SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Qt多线程编程实战:MD5单项加密
- 高速上云/网络穿透/视频上云网关EasyNTS组网服务平台如何通过复制穿透结果实现外网到内网的访问?
- SpringBoot常用注解的简单理解
- Qt多线程编程之线程的同步和互斥
- TS 设计模式06 - 代理模式
- TS 设计模式07 - 观察者模式
- Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)
- 前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
- leet笔记-62.不同路径
- leet笔记-63.不同路径II
- 五分钟C语言实现数据结构 之 二叉树链式存储
- 视频上云/网络穿透/网络映射服务EasyNTS前端切换页面卡顿如何优化?
- [译] 在 Vue 组件中分离 UI 和业务逻辑
- Android Notes|BottomNavigationView 爱上 Lottie
- Android Notes|玩转 ShapeableImageView