现在的位置: 首页 > 综合 > 正文

ios 接收 c# socket udp 组播

2018年05月05日 ⁄ 综合 ⁄ 共 5208字 ⁄ 字号 评论关闭

最近用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(
"\0",
"").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里加入

?
<span
style=
"color:
#ff0000;"
>#import
"AsyncUdpSocket.h"</span><br>@interface ViewController
: UIViewController<span style=
"color:
#ff0000;"
><AsyncUdpSocketDelegate>
</span>

  

?
@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);<br><br>

    NSMutableURLRequest *request = [[NSMutableURLRequestallocinit];

            // 设置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;
 
}

  

作者:李鹏
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

抱歉!评论已关闭.