我目前正在研究一种名为Julia的新语言。我想从我重写一个oly python脚本,这个脚本的一部分是连接到服务器,在这种情况下,一个来自Android模拟器。
但我对read, readline, readall
函数有问题。当没有这些时,他们并没有真正返回,朱莉娅等待并等待获得更多字节。在另一个服务器不发送“\ r \ n”的项目中,即使eof
也会永远等待。有没有办法让Julia只读取服务器从缓冲区发送的字节,而不是等待任何字节?我目前的连接代码如下所示:
client = connect("localhost", 7777)
@async while true
if eof(client) == false
line = readavailable(client)
println(line)
end
end
我如何对其进行编码,以便Julia在数据到达时运行代码,但只读取已到达的内容,而不是等待更多数据。
我也遇到了connect
的问题。如果我在终端中使用juli并且想要在没有监听client = connect("localhost", 7777)
的端口上建立到本地主机的连接,则会收到一条错误消息,表明连接被拒绝但在脚本中使用相同内容时,整个脚本也会失败,但整个脚本然后停止,在其他语言连接将返回一个错误,我可以尝试用我自己的代码处理问题。有谁知道为什么connect()
崩溃了整个剧本?
答案 0 :(得分:1)
似乎你的问题触及了朱莉娅的3个区域。
eof()
和readavailable()
并组合非阻止功能,例如:poll_fd(fd, time_s;readable=true) readbytes(fd, nb_available(fd))
但非阻塞I / O需要有关原子跃迁的精确保证,据我所知,在0.3.6中,它们并未提供。因此,您可以安排close()
。
异常处理 - Julia try/catch
阻止Exception
像许多其他语言一样致命。
C接口 - 许多软件包为C库提供存根,这些存根可以为特定协议提供更好的功能,即。带有libcurl的HTTPClient。
将(1)的变通方法与(2)的解决方案集成的示例:
println("start")
try
s = @spawn begin
# client = connect("localhost", 7777)
client = connect("yahoo.com", 80)
write(client, "GET /\r\n\r\n") # comment this out to test waiting
@schedule (sleep(3.0); close(client))
readall(client)
end
println(fetch(s))
catch exception
println("No Luck:", exception)
end
println("done.")