标签: cocoaasyncsocket

Swift:使用GCDAsyncUdpSocket接收UDP

背景:

我希望能够在我的iOS应用程序和服务器之间发送和接收UDP数据包.服务器将每个传入的消息回送给应用程序的客户端.服务器已经过测试并确认正常运行.我有一个StartViewController,启动两个实现GCDAsyncUdpSocketDelegate的类,一个用于发送,一个用于接收."发送套接字"正在工作,服务器接收消息.

问题:

应用程序在发送后永远不会收到回传消息.听取套接字设置的东西可能是错误的,因为didReceiveData永远不会被调用.

我完全错了吗?

开始:

class StartViewController: UIViewController {

   var inSocket : InSocket!
   var outSocket : OutSocket!

   override func viewDidLoad() {
       super.viewDidLoad()
       inSocket = InSocket()
       outSocket = OutSocket()
   }

   @IBAction func goButton(sender: UIButton) {
       outSocket.send("This is a message!")
   }
}
Run Code Online (Sandbox Code Playgroud)

接收:

class InSocket: NSObject, GCDAsyncUdpSocketDelegate {

   let IP = "255.255.255.255"
   let PORT:UInt16 = 5556
   var socket:GCDAsyncUdpSocket!

   override init(){
       super.init()
       setupConnection()
   }

   func setupConnection(){
       var error : NSError?
       socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
       socket.bindToPort(PORT, error: &error)
       socket.enableBroadcast(true, …
Run Code Online (Sandbox Code Playgroud)

udp ios cocoaasyncsocket swift gcdasyncudpsocket

18
推荐指数
1
解决办法
2万
查看次数

GCDAsyncUdpSocket和组播发送和接收

在第一种方法中,我创建了基于sampleProject的客户端 - 服务器应用程序,它将一些数据发送到服务器.

Legend:
sender
    address = reciver ip
    port = reciver port
reciver
    address = null since he is listening
    port = in my case 55555
Run Code Online (Sandbox Code Playgroud)

工作代码

跳过错误检查只是出于公共原因而故意

寄件人

-(id*)initForSender:(NSString*)address port:(int)port
 {
   self = [super init];
   if (self) {
        _port = port;
        _address = address;
        tag = 0;
        _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        [_udpSocket bindToPort:0 error:&error];
        [_udpSocket beginReceiving:&error];

      return self;
    }
}

-(void)send:(NSData*)data{
     [_udpSocket sendData:data toHost:_address port:_port withTimeout:-1 tag:tag];
     tag++;
}
Run Code Online (Sandbox Code Playgroud)

接收者/听众

-(id*)initForReceiver:(NSString*)address port:(int)port
{
   self …
Run Code Online (Sandbox Code Playgroud)

udp ios cocoaasyncsocket

10
推荐指数
1
解决办法
1万
查看次数

通过使用swift中的CocoaAsyncSocket通过UDP传输音频

我有一个问题是通过UDP在swift中通过CocoaAsyncSocket发送音频.

首先,我运行下面的代码开始监听4444 UDP端口.

vlc --demux=rawaud --rawaud-channels=1 --rawaud-samplerate=48000 udp://@:4444
Run Code Online (Sandbox Code Playgroud)

之后我在iPad2上运行我的应用程序并按连接.

import UIKit
import CocoaAsyncSocket
import AVFoundation
class ViewController: UIViewController , GCDAsyncUdpSocketDelegate {

var avAudioEngine : AVAudioEngine?

@IBAction func btnAction(sender: UIButton) {

    avAudioEngine = AVAudioEngine()
    let input = avAudioEngine?.inputNode

    let socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
    do {
        try socket.bindToPort(4445)
        try socket.connectToHost("192.168.0.137",onPort : 4444)
        try socket.beginReceiving()

        input?.installTapOnBus(0, bufferSize: 2048, format: input?.inputFormatForBus(0), block: { (buffer : AVAudioPCMBuffer, timeE: AVAudioTime) -> Void in
            socket.sendData(self.toNSData(buffer), withTimeout: 0, tag: 0)
        })

        avAudioEngine?.prepare()
        try avAudioEngine?.start()

        // with …
Run Code Online (Sandbox Code Playgroud)

udp ios cocoaasyncsocket swift avaudioengine

8
推荐指数
0
解决办法
754
查看次数

在 macOS 10.12 上绑定到套接字时出现 NSPOSIXErrorDomain

我正在 Swift 中使用CocoaAsyncSocket来绑定到 UDP 套接字并通过本地网络接收消息。

我正在初始化一个套接字,并尝试绑定到一个端口,但出现错误NSPOSIXErrorDomain。也许表明某种权限问题?

我的代码:

import Cocoa
import CocoaAsyncSocket

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, GCDAsyncUdpSocketDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let socket = GCDAsyncUdpSocket.init(delegate: self, delegateQueue: DispatchQueue.main)
        do {
            try socket.bind(toPort: 53401)
        } catch let msg {
            NSLog("Error....\(msg)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

完整错误:

Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Operation not permitted, NSLocalizedFailureReason=Error in bind() function}
Run Code Online (Sandbox Code Playgroud)

sockets macos udp cocoaasyncsocket swift

8
推荐指数
2
解决办法
1798
查看次数

你可以使用PhoneGap和iOS从本机代码(而不是在回调中)调用javascript函数吗?

我希望能够为我的应用程序使用PhoneGap.我将不得不构建一个自定义协议/插件,以便我可以从Javascript调用Native方法.我知道当本机代码返回时,您可以在Javascript中调用成功函数.

我需要做的是从本机代码调用javascript函数.基本上,应用程序将通过本地网络连接到OSX配套应用程序,当OSX应用程序将数据发送到iOS应用程序时,它将以Objective C方式处理,我需要能够将结果发送到PhoneGap/javascript并执行某些操作在WebView中使用它.

这可能吗?我只能从javascript中找到有关调用native的信息,而不是相反.

谢谢,托马斯

使用下面的答案中的代码:

MyPhoneGapPlugin.m

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
    NSLog(@"Connected To %@:%i.", host, port);

    NSString* jsString = [NSString stringWithFormat:@"alert(connected to: %@);", host];
    [theWebView stringByEvaluatingJavaScriptFromString:jsString];

    [self readWithTag:2];
}
Run Code Online (Sandbox Code Playgroud)

给我错误'未知接收器'theWebView'你的意思是'UIWebView'?

更新:找到答案:使用phonegap助手我可以写这样的东西......

    [super writeJavascript:@"alert('connected');"];
Run Code Online (Sandbox Code Playgroud)

javascript events objective-c cocoaasyncsocket cordova

7
推荐指数
2
解决办法
2万
查看次数

如何在当前的RunLoop中执行GCDAsyncSocket中的didReadData?

我正在尝试使用GCDAsyncSocket一个简单的例子,并且发现我缺少某些理解,并希望你们好,人们可以帮助解释这一点.

我在下面设置了GCDAsyncSocket:

dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];

NSString *host = @"192.168.169.132";
uint16_t port = 2112;

DDLogInfo(@"Connecting to \"%@\" on port %hu...", host, port);
self.viewController.label.text = @"Connecting...";

NSError *error = nil;
if (![asyncSocket connectToHost:host onPort:port withTimeout:5.0 error:&error])
{
    DDLogError(@"Error connecting: %@", error);
    self.viewController.label.text = @"Oops";
}
else
{
    DDLogVerbose(@"Connecting...");
}


- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
    DDLogInfo(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port);
    self.viewController.label.text = @"Connected";

    // We're just going to send a test string to …
Run Code Online (Sandbox Code Playgroud)

runloop cocoaasyncsocket

7
推荐指数
1
解决办法
1万
查看次数

通过在iPhone应用程序中使用GCDAsyncSocket库进行连接后立即断开套接字

我想从OBD2 Wifi启用的适配器读取和写入数据,该适配器用于读取汽车数据和故障代码.为此,我使用GGCDAsyncSocket库进行套接字连接.

您可以下载CocoaAsyncSocket Library源代码

但它几乎保持连接10秒,有时40-50秒,然后终止.

日志显示:

套接字断开连接:错误域= NSPOSIXErrorDomain代码= 57"操作无法完成.套接字未连接"UserInfo = 0x14cd50 {}

任何帮助或想法将不胜感激!

提前致谢 !

请看下面的代码:

- (void)connectObdKeyHost:(NSString*)strHost port:(NSString *)strPort {
        [gcdAsyncSocket connectToHost:strHost onPort:portNo withTimeout:30 error:&error];
}

// GCDAsyncSocket Delegate Methods
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port {
   NSLog(@"Socket connected : ");
}

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
    NSLog(@"Socket disconnected : %@",err);
}
Run Code Online (Sandbox Code Playgroud)

sockets ios cocoaasyncsocket gcdasyncsocket

7
推荐指数
1
解决办法
2240
查看次数

带有客户端身份验证的GCDAsyncSocket

我一直在使用CocoaAsyncSocket将数据发送到没有SSL的服务器.现在服务器端已经实现了SSL/TLS和客户端身份验证.为了在我们的应用程序中实现这一点,我得到了以下三个文件:

  1. CA-chain.cert.pem
  2. 客户test.cert.pem
  3. 客户test.key.pem

我将文件转换为iOS可读格式,如下所示:

  1. ca-chain.cert.pem到ca-cert.cer
  2. client-test.cert.pem到client_cert.cer
  3. client-test.key.pem到client_key.p12

我已经让它工作到SSL.但是客户端身份验证有问题.

这是我的代码:

didConnectToHost:

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
{
    // Configure SSL/TLS settings

    NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];

    // Allow self-signed certificates
    CFArrayRef certsArray = [self loadCertificates];
    [settings setObject:@0 forKey:GCDAsyncSocketSSLProtocolVersionMax];
    [settings setObject:[NSNumber numberWithBool:YES] forKey:GCDAsyncSocketManuallyEvaluateTrust];
    [settings setObject:(id)CFBridgingRelease(certsArray) forKey:GCDAsyncSocketSSLCertificates];
    [sock startTLS:settings];
}
Run Code Online (Sandbox Code Playgroud)

didReceiveTrust:

- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler {
    NSString *caCertPath = [[NSBundle mainBundle] pathForResource:@"ca-cert" ofType:@"cer"];
    NSData *caCertData = [NSData dataWithContentsOfFile:caCertPath];

    NSString *clientCertPath = [[NSBundle mainBundle] pathForResource:@"client_cert" ofType:@"cer"];
    NSData …
Run Code Online (Sandbox Code Playgroud)

ios cocoaasyncsocket ssl-client-authentication

7
推荐指数
1
解决办法
699
查看次数

不调用GCDAsynSocketDelegate didReadData方法.使用GCDAsynSocket

我试图简单地使用GCDAsyncSocket发送和接收消息,但无法使其工作.

我正在成功建立连接并写入消息,但是当涉及到阅读时,我的委托从未被调用过.

我正在使用ios5和这个设置:

客户:

-(void) connectToHost:(HostAddress*)host{

    NSLog(@"Trying to connect to host %@", host.hostname);

    if (asyncSocket == nil)
    {
        asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

        NSError *err = nil;
        if ([asyncSocket connectToHost:host.hostname onPort:host.port error:&err])
        {
            NSLog(@"Connected to %@", host.hostname);

            NSString *welcomMessage = @"Hello from the client\r\n";
            [asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];

            [asyncSocket readDataWithTimeout:-1 tag:0];
        }else
            NSLog(@"%@", err);
    }

}
Run Code Online (Sandbox Code Playgroud)

不调用Delegate didReadData方法

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{

    NSLog(@"MESSAGE: %@", [NSString stringWithUTF8String:[data bytes]]);

}
Run Code Online (Sandbox Code Playgroud)

服务器

-(void)viewDidLoad{

    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    connectedSockets …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios5 cocoaasyncsocket gcdasyncsocket

6
推荐指数
1
解决办法
4868
查看次数

为什么EventMachine出站数据缓冲区可能会停止发送并且只是永远填满(而其他连接仍然可以发送)

我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.

当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.

是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).

cocoa tcp eventmachine cocoaasyncsocket gcdasyncsocket

6
推荐指数
1
解决办法
388
查看次数