如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?
Posted
技术标签:
【中文标题】如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?【英文标题】:How to "connectToHost:" and "acceptOnPort:" on same GCDAsyncSocket object? 【发布时间】:2017-06-30 10:27:35 【问题描述】:我正在尝试在同一个 GCDAsyncSocket 对象上“send to”和“receive from”,但它在尝试初始化对象时返回错误为Attempting to accept while connected or accepting connections. Disconnect first.
.
我的代码:
-(instancetype)initWithHost:(NSString *)host port:(NSInteger)port userData:(NSDictionary *)userData delegate:(id<AKSenderSocketDelegate>)delegate
self = [super init];
if (self)
self.delegate = delegate;
self.senderSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
self.senderSocket.userData = userData;
NSError *err = nil;
//---- Sender
if (![self.senderSocket connectToHost:host onPort:port error:&err])
NSLog(@"Failed to connect: %@", err);
else
NSLog(@"Connected to :%@:%ld",host,(long)port);
//---- Listener
if (![self.senderSocket acceptOnPort:0 error:&err])
NSLog(@"Failed to open lintening port. :%@",err.localizedDescription);
else
NSLog(@"Listening to port :%hu and host :%@",self.senderSocket.localPort,self.senderSocket.localHost);
return self;
请帮忙!!
【问题讨论】:
【参考方案1】:你把布丁煮过头了(笑)。连接后,您就可以开始通信了。不需要接受消息。
connectToHost:onPort:error:
就像拨打电话:您拨打电话,对方接听(因为对方已经通过acceptOnPort:error:
或其等效项提供自己的服务)。建立连接后,您可以在同一个套接字上读取和数据;套接字是双向的。
因此,如果您想“拨打电话”,请使用connectToHost:onPort:error:
。如果您想等待对方拨打电话,请使用acceptOnPort:error:
。无论对话的哪一方是“连接者”或“接受者”,对话双方都可以发送(写)和收听(读)。
【讨论】:
以上是关于如何在同一个 GCDAsyncSocket 对象上“connectToHost:”和“acceptOnPort:”?的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中通过 GCDAsyncsocket 读取 xml 文件
浏览器上的 GCDAsyncSocket 立即连接和断开连接,并出现“远程对等方关闭套接字”错误
GCDAsyncSocket - 不接收数据 - AsyncSocket 工作正常
GCDAsyncSocket 未接收到所有传输的数据,缺少最后一个“块”