【发布时间】: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