Erlang和Ruby的Socket通讯

server.erl

Java代码

  1. -module(server).
  2. -export([start/0,start/1,process/1]).
  3. -define(defPort, 8888).
  4. start() -> start(?defPort).
  5. start(Port) ->
  6. case gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]) of
  7. {ok, LSock} -> server_loop(LSock);
  8. {error, Reason} -> exit({Port,Reason})
  9. end.
  10. %% main server loop - wait for next connection, spawn child to process it
  11. server_loop(LSock) ->
  12. case gen_tcp:accept(LSock) of
  13. {ok, Sock} ->
  14. spawn(?MODULE,process,[Sock]),
  15. server_loop(LSock);
  16. {error, Reason} ->
  17. exit({accept,Reason})
  18. end.
  19. %% process current connection
  20. process(Sock) ->
  21. Req = do_recv(Sock),
  22. Resp = "Hello, " ++ Req ++ "!",
  23. do_send(Sock,Resp),
  24. gen_tcp:close(Sock).
  25. %% send a line of text to the socket
  26. do_send(Sock,Msg) ->
  27. case gen_tcp:send(Sock, Msg) of
  28. ok -> ok;
  29. {error, Reason} -> exit(Reason)
  30. end.
  31. %% receive data from the socket
  32. do_recv(Sock) ->
  33. case gen_tcp:recv(Sock, 0) of
  34. {ok, Bin} -> binary_to_list(Bin);
  35. {error, closed} -> exit(closed);
  36. {error, Reason} -> exit(Reason)
  37. end.

client.rb

Java代码

  1. require 'socket'
  2. client = TCPSocket.open('localhost', 8888)
  3. client.send("hideto", 0)
  4. puts client.readlines
  5. client.close

Erlang服务器编译运行:

Java代码

  1. Eshell > c(server.erl).
  2. Eshell > server:start().

Ruby客户端解释运行:

Java代码

  1. > ruby client.rb
  2. Hello, hideto!