2015-04-18 41 views
2

我目前正在尋找一種名爲Julia的新語言。我想重寫一個來自我的oly python腳本,並且這個腳本的一部分是連接到一個服務器,在那種情況下,一個來自android模擬器。 但我有問題read, readline, readall函數。在解讀這些時,他們並沒有真正返回,並且Julia等待並等待獲取更多字節。而在另一個服務器不發送「\ r \ n」的項目中,即使eof也會一直等待。有沒有辦法讓Julia只讀取服務器從緩衝區發送的字節,而不是等待?我現在的連接代碼如下所示:Julia - Readall阻止其他任務

client = connect("localhost", 7777) 
@async while true 
    if eof(client) == false 
     line = readavailable(client) 
     println(line) 
    end 
end 

如何我的代碼,所以朱莉婭運行的代碼當數據到達,但只有在讀什麼已經到來,僅此而已,並不會等待更多的數據。 我也遇到了connect的問題。如果我在終端中使用juli,並且希望在沒有任何監聽的端口上連接到本地主機,我會收到一條錯誤消息,指出連接被拒絕,但在腳本中使用同一個腳本時,整個腳本也會失敗,但整個腳本然後停止,在其他語言連接會返回一個錯誤,我可以嘗試用我自己的代碼來處理這個問題。有誰知道爲什麼connect()崩潰了整個腳本?

回答

1

看起來你的問題涉及茱莉亞的3個地區。

  1. 非阻塞I/O - 在理想情況下,你可以避開eof()readavailable()並結合無阻塞功能,例如:
 
    poll_fd(fd, time_s;readable=true) 
    readbytes(fd, nb_available(fd)) 

但非阻塞I/O需要精確關於原子躍遷的保證,並且據我在0.3.6中可以看到的,它們沒有提供。所以你可以安排一個close()

  • 異常處理 - 朱具有try/catch防止Exception成爲致命像在許多其他語言。

  • C-接口 - 許多包爲C庫提供存根,這可能爲特定協議提供更好的功能,即, HTTPClient與libcurl。集成解決方法的

  • 實施例(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.")