Итак, я едва смог установить libzmq на рабочий стол Windows, а затем zeromq-haskell с помощью Cabal. Я хотел протестировать API, связав программу Python с программой Haskell в приложении типа hello-world.
Итак, самый простой шаблон, который я вижу, — это шаблон «запрос-ответ». Сначала я попытался сделать сервер на хаскеле (REP) и клиент на python (REQ), но это с треском провалилось, что бы я ни делал. Сгенерированное сообщение об исключении было Исключение: получение: сбой (без ошибок).
Поэтому я заглядываю внутрь исходного кода System.ZMQ и System.ZMQ.Base и вижу, что при вызове c_zmq_recv вызывается ошибка, которая, в свою очередь, сопоставляется непосредственно с вызовом ffi (?) C api. Поэтому я думаю, что, возможно, я не выполнил установку должным образом, но затем я попытался сделать клиент на Haskell, а сервер на python, и я заметил, что он работает без каких-либо проблем, так что, возможно, интерфейс recv здесь не проблема.
Вот приведенный ниже код haskell с функциями клиента и сервера.
import System.ZMQ
import Control.Monad (forM_,forever)
import Data.ByteString.Char8 (pack,unpack)
import Control.Concurrent (threadDelay)
clientMain :: IO ()
clientMain = withContext 1 (\context->do
putStrLn "Connecting to server"
withSocket context Req $ (\socket-> do
connect socket "tcp://127.0.0.1:5554"
putStrLn $ unwords ["Sending request"]
send socket (pack "Hello...") []
threadDelay (1*1000*1000)
reply<-receive socket []
putStrLn $ unwords ["Received response : ",unpack reply]))
serverMain :: IO ()
serverMain = withContext 1 (\context-> do
putStrLn "Listening at 5554"
withSocket context Rep $ (\socket-> do
connect socket "tcp://127.0.0.1:5554"
forever $ do
message<-receive socket [] -- this throws an IO Exception
putStrLn $ unwords ["Received request : ",unpack message]
threadDelay (1*1000*1000)
send socket (pack "World") [] ))
main :: IO ()
main = serverMain -- replace with clientMain and it works
Теперь я действительно не удосужился протестировать все другие способы связи (push/pull, подписка/публикация, пара и т. д.), и для того, что мне нужно, сервер python/клиент haskell, вероятно, лучше, но мне любопытно, какая погода у меня будет. m делаю что-то не так или если какая-либо часть моего кода каким-либо образом нарушена.
заранее спасибо
serverMain
вwithSocketsDo
, как указано в сетевые документы? Раньше я не использовалnetwork
с Windows, но вспомнил эту маленькую загвоздку. - person ScottWest   schedule 07.06.2012