Mar*_*nop 6 sockets iphone objective-c asyncsocket
我使用GCDAsyncSocket将iPhone客户端连接到服务器.服务器在Windows服务器上运行.Net.连接很好,它也可以很好地发送数据.
然后我告诉客户在发送后直接进入接收...
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:15 tag:1];
Run Code Online (Sandbox Code Playgroud)
我也有这个设置接收:
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data
withTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
并且:
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
如果我等待超时,则调用超时方法.
如果我从服务器发送数据,则不会调用超时,因此我假设客户端已经看到了某些内容,但在客户端没有任何指示.
我还补充说:
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength: (NSUInteger)partialLength tag:(long)tag
Run Code Online (Sandbox Code Playgroud)
希望我会看到一个部分数据包,但这也不会被触发.
如上所述,如果我从服务器向客户端发送内容,则不会触发超时.但是,如果它没有收到终结符,我会认为它也会超时.我也试过读长度为3但是没有任何区别.
GCDAsyncSocket就是问题所在.AsyncSocket似乎工作正常.
也许它的init是错的?
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue]
我做错了什么想法?
为此我在护目镜代码上贴了一个帖子,但没有任何活动,所以不确定我是否会得到答案.
理想情况下,如果有人有一个示例代码,接收器工作将是伟大的!谢谢!
也许拼写有问题.(所以这发生在我身上,我正在寻找几个小时,直到我看到了微小的差异)
GCDAsyncSocket将所有委托回调从onSocket重命名为socket,以匹配Apples命名样式.
在上面的例子中你提到过
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
将其重命名为
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
这应该可以解决这个问题.
在我的代码中,我也遇到了另一个问题.在连接时,确保调用GCDAsyncSocket的对象仍处于活动状态.GCDAsyncSockets委托是对象的弱引用.并且因为它是异步的,所以当套接字响应时,委托可以变为零(自动释放,或者实例是在已经离开的方法中创建的).结果它似乎没有被调用,但启动套接字的类已经从内存中释放.如果您将ARC与GCDAsyncSocket一起使用,则会发生这种情况.
希望这可以帮助
您确定您的服务器正在发送仅以换行而不是 CRLF 终止的数据吗?或者也许您从服务器发回的数据没有被任何内容终止? readDataToData将等待,直到到达接收到的数据中的终止字符。
这是我用来连接的代码。我删除了我认为不必要的内容 - 希望我没有删除任何重要的内容。
初始化套接字
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
Run Code Online (Sandbox Code Playgroud)
连接
[asyncSocket connectToAddress:addr error:&err]
Run Code Online (Sandbox Code Playgroud)
连接时
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
connected = YES;
Run Code Online (Sandbox Code Playgroud)
发送(无超时)
[asyncSocket writeData:dataData withTimeout:-1 tag:0];
Run Code Online (Sandbox Code Playgroud)
请求读取数据
[asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:0];
Run Code Online (Sandbox Code Playgroud)
数据已通过(我只是发送字符串)
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13037 次 |
| 最近记录: |