Simple networked client-server example program:
Compile and install Thrift
Don't have full requirements for compiling Thrift off the top of my head; it requires Network, Binary and possibly some other things.
Create a thrift file
test.thrift
namespace hs test enum Operation { ADD = 1, SUBTRACT = 2, MULTIPLY = 3, DIVIDE = 4 } struct Work { 1: i32 num1 = 0, 2: i32 num2, 3: Operation op, 4: optional string comment, }
Compile the thrift file
$ thrift --gen hs test.thrift
Write your Haskell program
Requirements
File test.hs
module Main where import Data.List import IO import Network import System (getArgs) -- Thrift libraries import Thrift import Thrift.Transport.Handle import Thrift.Protocol import Thrift.Protocol.Binary import Thrift.Server -- Generated Thrift modules import Test_Types
Constants
port :: PortNumber port = 4390 testdata :: Work testdata = Work { f_Work_num1 = Just 1, f_Work_num2 = Just 2, f_Work_op = Just ADD, f_Work_comment = Just "Foo!" } testdata2 :: Work testdata2 = Work { f_Work_num1 = Just 10, f_Work_num2 = Just 20, f_Work_op = Just SUBTRACT, f_Work_comment = Just "Bar!" }
Functions
serverFunc :: a -> (BinaryProtocol Handle, BinaryProtocol Handle) -> IO Bool serverFunc a (h1,h2) = do let t1 = getTransport h1 let t2 = getTransport h2 putStrLn "Server go!" dat <- read_Work h1 putStrLn "Recieved data:" print dat write_Work h1 testdata2 tFlush t1 putStrLn "Data written" return False clientFunc :: HostName -> PortNumber -> IO () clientFunc host p = do putStrLn "Client go!" h <- connectTo host $ PortNumber p let proto = BinaryProtocol h write_Work proto testdata tFlush h putStrLn "Data sent, receiving." w <- read_Work proto putStrLn "Recieved:" print w tClose h main :: IO () main = do a <- getArgs if elem "client" a then do clientFunc "127.0.0.1" port else do runBasicServer () serverFunc port putStrLn "Server stopped"
Compile your Haskell program
$ ghc --make gen-hs/*.hs test.hs
Run it
# Start server host1$ ./test # Run client host2$ ./test client
Issues with this
- In serverFunc, whether you read/write to/from h1 or h2 does not seem to matter. What's up with that?
- Does not demonstrate implementing services
- Does not demonstrate maps, constants, etc...
- runBasicServer listens on IPv4 only
- Compiling Thrift is a little painful and could use more explanation; also, the version in Hackage is 0.5.0 and the current (and version used here) is 0.6.0.