使用UDP方式 與iOS端App通訊
阿新 • • 發佈:2019-02-15
- 首先需要安裝一個TCP&UDP測試工具
- 連線型別選擇UDP
- 目標IP 設定手機的IP, 埠8888 (這個埠在App端用來繫結)
- 指定埠, 是App向回發信息所需要的埠, 具體設定如下圖所示
接下來為減少程式碼的鍵入, 我直接使用CocoaAsyncSocket這個三方庫,作為中間媒介完成整個過程
{
GCDAsyncUdpSocket *udpSocket; // 定義一個socket的物件 簽訂代理 GCDAsyncUdpSocketDelegate
}
麥 2017/7/20 17:05:40
/*************** UDP ***********************/
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
NSError *error = nil;
// 繫結埠
[udpSocket bindToPort:8888 error:&error];
// 啟用廣播
[udpSocket enableBroadcast:YES error:&error];
if (error) {
[SVProgressHUD showErrorWithStatus:@"啟用失敗" ];
}else {
NSLog(@"%@", [udpSocket localHost]);
// 開始接收訊息
[udpSocket beginReceiving:&error];
}
/*************** UDP ***********************/
#pragma mark - GCDAsyncUdpSocketDelegate
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(nullable id)filterContext {
NSLog(@"success");
NSString *ip = [GCDAsyncUdpSocket hostFromAddress:address];
NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"收到響應 %@ %@", ip, s);
[sock receiveOnce:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
uint16_t port = 9999;
[self sendBackToHost:ip port:port withMessage:s];
});
}
- (void)sendBackToHost:(NSString *)ip port:(uint16_t)port withMessage:(NSString *)s{
// 回一個 hello summerxx too
char *str = "hello summerxx too" ;
NSData *data = [NSData dataWithBytes:str length:strlen(str)];
[udpSocket sendData:data toHost:ip port:port withTimeout:0.1 tag:200];
}