ios - iPad GCDAsyncSocket 无法读取

标签 ios sockets

我的项目真的需要一些帮助... 我需要与用 Java 编写的服务器交换数据。我尝试使用 GCDAsyncSocket,我可以向服务器发送消息,在服务器上读取它,但是当服务器向客户端发送响应时,我不能(不知道如何)在客户端读取它。这是我的部分代码:

- (void) someMethod{
    NSError *err = nil;
    asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    if(![asyncSocket connectToHost:@"localhost" onPort:7777 error:&err]){
        // If there was an error, it's likely something like "already connected" or "no delegate set"
        NSLog(@"I goofed: %@", err);
    }
    NSString *requestStr = @"<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><root><service>1</service><type>1</type><userProperties><username>ivo</username></userProperties></root>";
    NSData *requestData = [requestStr dataUsingEncoding:NSUTF8StringEncoding];

    [asyncSocket writeData:requestData withTimeout:-1.0 tag:0];

    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:1.0 tag:0];
    [asyncSocket disconnectAfterWriting];
}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
    if (tag == 0)
        NSLog(@"First request sent");
    else if (tag == 2)
        NSLog(@"Second request sent");
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
}

请帮助,如果有另一种方法我愿意尝试,因为我越来越绝望......

最佳答案

我看到您正在发送 XML,请求数据末尾没有特定的终止符,但您希望服务器发送以\r\n 终止的响应?

协议(protocol)规定了什么?

通过 tcp 发送和接收数据是造成混淆的常见原因,因为 tcp 是基于流的。它没有单独读/写的概念。它在概念上将所有数据视为永无止境的流。该协议(protocol)规定了消息边界。有关更好的解释,请参阅 GCDAsyncSocket 的 wiki 中的“常见陷阱”一文: https://github.com/robbiehanson/CocoaAsyncSocket/wiki/CommonPitfalls

我认为这将有助于解释很多内容。

关于ios - iPad GCDAsyncSocket 无法读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8525218/

相关文章:

ios - 来自 Firebase 的数据未排序

ios - 如何选择 iOS 模拟器作为 Xcode 中的目的地?

ios - Objective-C:获取每个表行的文本字段值

C++ 如何加入多播 mpeg 流?

node.js - socket.io 在客户端不工作(传输错误)

javascript - 使用 NodeJS 的文件路径问题

ios - 在 Objective-C 中实现 singleTap 和 doubleTap

c++ - 如何通过 UNIX 套接字发送 std::vector<std::string> ?

javascript - 可以从 Web 浏览器加载 Socket.IO(express)服务器吗?

ios - 如何正确地 "clean"从 Swift 中的 Superview 中删除的 UIView? - IOS