背景:
我希望能够在我的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) 在第一种方法中,我创建了基于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在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) 我正在 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) 我希望能够为我的应用程序使用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) 我正在尝试使用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) 我想从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) 我一直在使用CocoaAsyncSocket将数据发送到没有SSL的服务器.现在服务器端已经实现了SSL/TLS和客户端身份验证.为了在我们的应用程序中实现这一点,我得到了以下三个文件:
我将文件转换为iOS可读格式,如下所示:
我已经让它工作到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) 我试图简单地使用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) 我有一个EventMachine服务器将TCP数据发送到Mac客户端(通过GCDAsyncSocket).它总是完美无缺地工作一段时间,但服务器不可避免地突然停止逐个连接地发送数据.仍然保持连接,并且服务器仍然从客户端接收数据,但它不会采用其他方式.
当发生这种情况时,我通过连接#get_outbound_data_size发现连接发送缓冲区无限填充(通过#send_data)而不是发送到客户端.
是否存在可能发生这种情况的具体(并且有希望解决)原因?反应堆保持嗡嗡声,与服务器的其他活动连接继续正常工作(尽管它们有时也会陷入缓冲区地狱).
cocoaasyncsocket ×10
ios ×5
udp ×4
swift ×3
objective-c ×2
sockets ×2
cocoa ×1
cordova ×1
eventmachine ×1
events ×1
ios5 ×1
iphone ×1
javascript ×1
macos ×1
runloop ×1
tcp ×1