问题标签 [gcdasyncsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1372 浏览

ios - GCDAsyncSocket 客户端直到写入才读取

包含的代码并不多,但为什么 GCDAsyncSocket 客户端会在读取时停止,直到 writeData 排队?症状:

  • 尽管服务器调用“didAcceptNewSocket”,但不会调用“didConnectToHost”。
  • 服务器写入数据时不会调用“didReadData”
  • “socketDidDisconnect”没有被调用
  • 来自客户端的写入正确传输

令人难以置信的是,调用“writeDelayed”方法(仅将“writeData”方法排入队列)可以正确处理所有读取。从方法中删除“writeData”会禁用读取。

这让我觉得配置的 GCD 调度队列是错误的,所以我尝试了每一个新的和默认的串行和并发队列

或者套接字对象在它的时间之前被释放,所以我将它设置为一个类属性,但无济于事。

可能使事情复杂化的一件事(尽管我不知道如何)是正在建立连接以响应已解析的 NSNetService (Bonjour) 对象,该对象可能位于不同的调度队列中。但是我尝试将“setupConnection”包装在要在主队列上执行的块中,但无济于事。

这里是一小部分代码,如果有任何问题我会编辑。

谢谢你,詹姆斯

0 投票
1 回答
726 浏览

ios - iOS 下带有 2 个不同库的损坏 JPEG

我的代码已经运行了很长时间,但我最近有 2 台新的网络摄像机通过 HTTP 运行高分辨率 MJPEG 图像流,并且我看到两台摄像机的损坏 JPEG 如下所示。所以很确定它与硬件无关。较旧的低分辨率相机仍然可以正常工作。

到目前为止我一直在使用的方法:

这一直工作正常,我一直在确保我的 JPEG 以 0xff 0xd8 开头并以 0xff 0xd9 结尾。

有了更大的图像,我现在得到:

所以我决定试试 libturbojpeg,它显示了类似的解码视觉伪影,但没有错误消息。

流似乎可以通过浏览器正常工作......但是如果我从模拟器中保存一个帧,然后加载到浏览器中,工件就在那里。

我正在使用 GCDAsyncSocket 进行网络连接,它也可以正常工作很长时间了。

所以我想知道是否有人可以阐明事情可能在哪里被破坏了。如果网络数据丢失了,我怀疑我会得到完整的帧,或者预期的 15fps,(虽然我不知道 JPEG 对丢失有多敏感......)但我想不出还有什么可能导致这种问题。

更新:我已经尝试更换网络层,并看到相同的图像损坏,用完了可以尝试的东西。我还尝试将图像保存到磁盘,它从磁盘加载到已经损坏的浏览器中。如果我将浏览器指向源流,图像到达没有问题。

示例 jpeg

0 投票
2 回答
3924 浏览

ios - 使用 GCDAsyncSocket 进行同步通信

我在我的应用程序中使用GCDAsyncSocket( CocoaAsyncSocket) 进行套接字通信。由于 的异步特性GCDAsyncSocket,我的网络请求(submitMessage如下)与接收数据时运行的回调块(socket:didReadData)分离。

这种方法适用于一次性交易。但是在某些情况下,我需要发布一个请求,然后使用接收到的数据,发布另一个请求。我无法让它正常工作。基本上,我需要这样的东西:

或者

严格的顺序是 request1 - callback1 - request2 - callback2。

那么问题来了,如何在第一个请求回调后阻止第二个请求运行呢?GCD(?dispatch_sync)会是要走的路吗?

编辑

我最终使用了类似于@tigloo 建议的解决方案(因此接受了他的回答),但使用NSCondition了代替GCD(如果有人对细节感兴趣,我遵循了这个很棒的讨论)。我已经在运行多个线程(主线程中的 UI,另一个线程中的高级套接字通信,以及第三个线程中的套接字操作)。设置类属性并使用NSCondition锁定GCDAsyncSocket委托直到响应到达似乎是最干净的方法。

0 投票
1 回答
112 浏览

ios - 不同类别的 GCD

我有一个应用程序,它在启动时会检查用户的位置,然后获取该地点的天气。主要是风向和风速。

它会正常检查是否有 Internet 连接,但我发现如果有连接,但速度很慢,应用程序会在启动屏幕上冻结(在启动时进行检查)。

我有一个执行此操作的类,它在启动时调用,然后加载主屏幕。环顾四周,GCD 似乎是正确的方法,但我可以得到答案以显示在主屏幕的标签中完成获取数据了吗?主踏板会离开,或者更确切地说绕过该类并到达主屏幕。

我是否需要使用通知中心之类的东西来帮助标签更新和重新加载?

感谢您的任何想法或代码片段。约根

PS。我试图让应用程序 iOS 5.1 保持旧 iPad 的快乐。

0 投票
2 回答
3686 浏览

ios - iOS6 上的 GCDAsyncUdpSocket 出现“对等连接重置”错误

我在使用 GCDAsyncUdpSocket 时遇到问题。我将 iPad 用作与另一个应用程序交互的用户界面应用程序 - 称之为主机,后者在单独的 Windows 机器上运行。两台机器都在自己的专用网络上,因此它们在自己的子网上。在某些时候,主机向 iPad 发送 UDP 数据包以指示它向用户显示哪个屏幕,然后 iPad 通过 UDP 数据包向主机发送用户响应。最后,iPad 会定期(以 2 Hz)向主机发送简单的“心跳”消息。

这一切都很好 - 有一段时间。然后,显然,iPad 突然停止接受来自主机的 UDP 数据包 - 后者遇到“对等连接重置”错误,而它(iPad)仍在成功发送和主机接收心跳消息。

我认为问题出在我对 Grand Central Dispatch (GCD) 工作方式的困惑。我的 iPad 应用程序非常简单;我基于 iOS 编程教程(我是这里的初学者,但在 Windows、Linux、嵌入式/实时和网络方面非常有经验)。它基本上由一个主屏幕组成,它不时创建第二个屏幕。所以基本结构是这样的:

  • 主文件
  • 代表.m
  • 主视图控制器.m
  • 弹出视图控制器.m

main.m 和 Delegate.m 是在教程中由 Xcode 自动创建的,它们并没有什么特别之处。MainViewController.m 是我的“主屏幕”,拥有 iPad 应用程序使用的 GCDAsyncUdpSocket。最后一个文件 PopupViewController.m 是第二个屏幕,使用如下:

现在来看似乎失败的代码。首先,这是 MainViewController.m 的 @interface 部分:

这是我创建 UDP 对象的方式/位置:

这是我绑定到端口的地方:

这是接收数据包的代码。显然,这个功能可以正常工作一段时间,有时几十次,然后意外失败。

我不知道为什么 didReceiveData 函数似乎在一些随机时间(以及随机发送/接收的消息数)内正常工作。我想知道几件事:

  1. 从第二个屏幕发送 UDP 消息对我有效吗?我认为是这样,并且发送永远不会失败 - 即使在接收失败后它也会继续工作。

  2. 无论如何, didReceiveData 是如何被调用的,又怎么会被破坏呢?如果我在 Linux 或 RTOS 中,我可能会创建一个显式线程来等待数据包;GCD 框架如何决定一个数据包应该去哪里?

  3. 为什么我的应用会突然停止监听端口?我如何检测/调试它?

  4. GCDAsyncUdpSocket 对象由主屏幕拥有,而不是 Delegate.m 模块,这有关系吗?

  5. 像我想的那样使用主调度队列是否合适?确实,我这样做是正确的吗?

我完全不知所措,所以当然,任何建议都会非常感激!无需回答所有问题 - 特别是如果您的答案就是解决方案!

谢谢!

0 投票
0 回答
154 浏览

ipad - 所有 ViewController 对 GCDAsyncUdpSocket 中的 UDP 套接字的共同访问

我正在开发一个使用 GCDAsyncUdpSocket 的 iPad 应用程序。该应用程序有多个视图控制器,我需要访问各种视图控制器中的 UDP 套接字。我是使用 GCD 和异步 UDP 库的新手。

允许所有视图控制器发送和接收 UDP 消息的最佳技术是什么?

0 投票
1 回答
890 浏览

ios - GCDAsyncSockets,得到答案

我正在尝试使用 GCDAsyncSocket 测试服务器连接。

https://github.com/robbiehanson/CocoaAsyncSocket

我想连接到一个 ip + 端口并收到一条消息,无论它是否有效。

我现在这么远。

{ // 应用程序启动后自定义的覆盖点。

}

但是我如何检查数据是否被写入?

if(![asyncSocket connectToHost:host onPort:port error:&error])

总是让我没有错误。

0 投票
1 回答
1838 浏览

xcode - 从广播模式更改为单播模式后,GCDasyncUdpSocket 无法接收数据包

开发通过 WiFi 与 UDP 到串行转换器通信的 iPAD 应用程序。应用程序以广播模式启动并检索响应单元 (requestPodIds) 的列表。接收到的数据将 SN 映射到单元 IP 地址。然后使用选定的 IP 地址在 iPad 和 UDP/串行转换器之间进行点对点通信。

我的代码在广播通信上运行良好。并且转换器正在接收我发送到单元 IP 地址的单播消息(requestStatus),并且它正在按预期响应。但是,我没有将任何数据返回到 didReceiveData 方法中。

我不明白为什么我没有在方法中取回数据:

我的套接字连接位于 AppDelegate 中,并且调用是来自 viewController 的模式。

AppDelegate 代码:

来自 ViewController 的访问如下:

0 投票
1 回答
4234 浏览

ios - GCDAsyncUdpSocket 无法在 iOS 模拟器上绑定端口

我正在通过UDP发送消息。但是,我一直被困在“绑定端口”的问题中。

当我第一次在 iOS 模拟器上构建项目时,没有发生任何奇怪的事情。一切都很好。

但是当我第二次构建项目时。当应用程序尝试绑定端口时,我从终端收到一条错误消息。

消息如下所示“错误域 = NSPOSIXErrorDomain 代码 = 48“地址已在使用中”用户信息 = 0x767c830 {NSLocalizedFailureReason =绑定()函数中的错误,NSLocalizedDescription =地址已在使用中}“

让我感到困惑的是,当我在 iPad 上运行我的应用程序时没有出现错误。

我想可能是因为我没有关闭套接字。但为什么它在 iPad 上能正常运行?</p>

希望有人能解决这个问题。谢谢!

0 投票
0 回答
238 浏览

ios - GCDAsyncSocket 数据接收异常

我正在编写一个 iPhone 应用程序来与串行设备通信(通过 RN-XV 串行到 wifi 板)。目前的通信协议是非常基本的:iPhone 发送字符“D”,而串行设备以“;”分隔的字符串作为应答。并由 LF (\n) 终止。

目前我正在用 Arduino 模拟串行设备,代码如下:

我发送的字符串只是串行设备发送的一个示例。

在 iPhone 端,我使用 GCDAsyncSocket 和以下代码:

在 ViewController.m 中:

在 SocketConnection.m 中:

问题是它的工作效率为 70%:

  • 大多数时候我收到的数据是正确的(数组中有 28 个对象)

  • 有时我没有收到任何东西(空)

  • 有时连同正确的字符串,我会收到更多我不知道它们来自哪里的数据

这是 XCode 控制台窗口中的输出示例:

2013-06-06 00:05:41.767 wakman[2714:907] 连接到主机:192.168.1.12 端口:2000

2013-06-06 00:05:43.868 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:43.870 wakman[2714:907] 计数 = 0

2013-06-06 00:05:45.886 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:45.888 wakman[2714:907] 计数 = 0

2013-06-06 00:05:47.868 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

2013-06-06 00:05:47.870 wakman[2714:907] 计数 = 28

2013-06-06 00:05:49.893 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

;--- ; => 这些数据来自哪里?

2013-06-06 00:05:49.895 wakman[2714:907] 计数 = 30

2013-06-06 00:05:51.892 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;第1467章 => 这些数据来自哪里?

2013-06-06 00:05:51.894 wakman[2714:907] 计数 = 44

2013-06-06 00:05:53.890 wakman[2714:907] Stringa: 04.06.2013 16:52:29 ;1090 ;--- ;--- ;--- ;--- ;--- ;- -- ;--- ;--- ;--- ;71365 ;--- ;2547 ;2547 ;--- ;1467 ;--- ;--- ;0 ;098 ;- ;--- ;- -- ;--- ;--- ;--- ;

2013-06-06 00:05:53.892 wakman[2714:907] 计数 = 28

2013-06-06 00:05:55.886 wakman[2714:907] Stringa: (null)

2013-06-06 00:05:55.888 wakman[2714:907] 计数 = 0 => 没有数据?

我的代码有什么问题吗?

谢谢, 科拉多