【问题标题】:Inconsistent Read Behavior With AsyncSocketAsyncSocket 的读取行为不一致
【发布时间】:2013-04-13 22:47:11
【问题描述】:

我正在使用 GCDAsyncSocket 编写一个 RubyMotion 应用程序,并且在将数据读取到特定术语(在我的情况下为 CRLF)时遇到不一致的结果。它有时会读取多个 CRLF 序列,而不是总是向上读取直到并包括下一个 CRLF。这本身不一定是一个问题,我可以拆分字符串并解析它,但是它有时会在后续字符串的中途读取,因此似乎会发生一些数据丢失。这似乎只发生在快速接收数据时。这是一个输出示例。我发送了字符串“你好,这是一个测试字符串。”从服务器到我的应用程序快速连续 100 次。正如您在下面的代码中看到的那样,我将字符串拆分为 \r\n,为特定的读取调用分配一个随机数并打印出结果数组的每个部分(0、1、2 等)。请记住,此方法规定它应该读取到 \r\n 并且不需要拆分。

ID 252 Part 0:你好,这是一个测试字符串。 ID 252 第 1 部分:您好,这是一个测试字符串。 ID 252 第 2 部分:您好,这是一个测试字符串。 ID 252 第 3 部分:您好,这是一个测试字符串。 ID 252 第 4 部分:您好,这是一个测试字符串。 ID 252 第 5 部分:您好,这是一个测试字符串。 ID 252 第 6 部分:您好,这是一个测试字符串。 ID 252 第 7 部分:您好,这是一个测试字符串。 ID 252 第 8 部分:您好,这是一个测试 ID 780 Part 0:你好,这是一个测试字符串。 ID 419 Part 0:你好,这是一个测试字符串。 ID 128 Part 0:你好,这是一个测试字符串。 ID 638 Part 0:你好,这是一个测试字符串。 ID 950 Part 0:你好,这是一个测试字符串。 ID 950 第 1 部分:字符串。 ID 704 Part 0:你好,这是一个测试字符串。

正如您在读取 ​​950 中看到的那样,肯定会发生一些损失。这是我的代码的相关部分。

def connect()
    $term = AsyncSocket.CRLFData
    clear_keybindings("")
    @ts = AsyncSocket.alloc.initWithDelegate(self, delegateQueue:Dispatch::Queue.main)
    @ts.connectToHost('...', onPort:4001, error:nil)
end

def onSocket(sock, didConnectToHost:host, port:port)
    $connected = true
    send_message('os ios')
    read_line
end

def onSocket(sock, didReadData:data, withTag:tag)
    read_line
    line = NSString.stringWithUTF8String(data.bytes)
    if !line
        return
    end
    id = Random.rand(1000)
    line.split("\r\n").each_with_index do |l, i|
        puts "ID #{id} Part #{i}: #{l}"
        parse(l)
    end
end

def read_line
    @ts.readDataToData($term, withTimeout:-1, tag:0)
end

在我写这篇文章的时候,我想知道使用 GCDAsyncSocket 是否可以解决这个问题,但是如果我改变它: @ts = GCDAsyncSocket.alloc.initWithDelegate(self, delegateQueue:Dispatch::Queue.main) 然后它连接,但我的委托方法根本不起作用,似乎也没有发送数据。任何帮助将不胜感激。

【问题讨论】:

  • 你解决过这个问题吗?我在尝试使用 AsyncSocket 设置服务器时遇到了类似的问题。

标签: ios rubymotion cocoaasyncsocket


【解决方案1】:

我会将您的read_line 调用移到didReadData:withTag: 委托方法的最后。如果您在短时间内收到大量数据,则您可能在委托方法有机会完成其当前数据的处理之前读取新数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多