今天学习了一下Erlang TCP编程,做了一个小Demo. 感觉比较好用的功能是:每当客户端Socket关闭的时候,会向服务器发送一条{error, closed}的消息,反之亦然。好像Java没有这个功能。
[code="erlang"]
-module(tcp_test).
-export([start_server/0, client/0, accept/1]).
start_server()->
{ok, ListenSocket}=gen_tcp:listen(9999,[binary,{active,false}]),
accept(ListenSocket).
accept(ListenSocket)->
{ok,Socket} = gen_tcp:accept(ListenSocket),
spawn(?MODULE, accept,[ListenSocket]),
process_request(Socket).
process_request(Socket)->
case gen_tcp:recv(Socket,0,5000) of
{ok,Binary}->
io:format("received request message ~p~n", [Binary]),
gen_tcp:send(Socket, "process successful"),
process_request(Socket);
{error, closed}->
io:format("socket close ~n");
_Req->
io:format("receive ~p~n", [_Req])
end.
client()->
{ok,Socket}=gen_tcp:connect({127,0,0,1},9999,[binary,{packet,0},{active,false}]),
gen_tcp:send(Socket, "erlang client sending message"),
case gen_tcp:recv(Socket,0,5000) of
{ok,Binary}->
io:format("result: ~p~n", [Binary]);
_Req->
io:format("unknow receive ~p~n", [_Req])
end,
ok = gen_tcp:close(Socket).
[/code]
[code="java"]
import java.net.Socket;
public class Client{
public static void main(String args[]) throws Exception{
Socket socket = new Socket("127.0.0.1", 9999);
socket.getOutputStream().write("java client send message".getBytes());
byte[] b = new byte[1024];
int length = socket.getInputStream().read(b);
System.out.println(new String(b,0, length));
socket.close();
}
}
[/code]
[b]运行结果如下:
Server端结果:[/b]
D:\temp\socket>erl
Eshell V5.8.4 (abort with ^G)
1> c(tcp_test).
{ok,tcp_test}
2> tcp_test:start_server().
received request message <<"erlang client sending message">>
socket close
ok
3> received request message <<"java client send message">>
3> socket close
3> inet:i().
Port Module Recv Sent Owner Local Address Foreign Address State
2068 inet_tcp 0 0 <0.30.0> *:9999 *:* ACCEPTING
2069 inet_tcp 29 18 <0.30.0> CONNECTED
Port Module Recv Sent Owner Local Address Foreign Address State
ok
4>
[b]Erlang client 端结果:[/b]
D:\temp\socket>erl
Eshell V5.8.4 (abort with ^G)
1> tcp_test:client().
result: <<"process successful">>
ok
2>
[b]Java client 端结果:[/b]
D:\temp\socket>javac Client.java
D:\temp\socket>java Client
process successful
D:\temp\socket>
[code="erlang"]
-module(tcp_test).
-export([start_server/0, client/0, accept/1]).
start_server()->
{ok, ListenSocket}=gen_tcp:listen(9999,[binary,{active,false}]),
accept(ListenSocket).
accept(ListenSocket)->
{ok,Socket} = gen_tcp:accept(ListenSocket),
spawn(?MODULE, accept,[ListenSocket]),
process_request(Socket).
process_request(Socket)->
case gen_tcp:recv(Socket,0,5000) of
{ok,Binary}->
io:format("received request message ~p~n", [Binary]),
gen_tcp:send(Socket, "process successful"),
process_request(Socket);
{error, closed}->
io:format("socket close ~n");
_Req->
io:format("receive ~p~n", [_Req])
end.
client()->
{ok,Socket}=gen_tcp:connect({127,0,0,1},9999,[binary,{packet,0},{active,false}]),
gen_tcp:send(Socket, "erlang client sending message"),
case gen_tcp:recv(Socket,0,5000) of
{ok,Binary}->
io:format("result: ~p~n", [Binary]);
_Req->
io:format("unknow receive ~p~n", [_Req])
end,
ok = gen_tcp:close(Socket).
[/code]
[code="java"]
import java.net.Socket;
public class Client{
public static void main(String args[]) throws Exception{
Socket socket = new Socket("127.0.0.1", 9999);
socket.getOutputStream().write("java client send message".getBytes());
byte[] b = new byte[1024];
int length = socket.getInputStream().read(b);
System.out.println(new String(b,0, length));
socket.close();
}
}
[/code]
[b]运行结果如下:
Server端结果:[/b]
D:\temp\socket>erl
Eshell V5.8.4 (abort with ^G)
1> c(tcp_test).
{ok,tcp_test}
2> tcp_test:start_server().
received request message <<"erlang client sending message">>
socket close
ok
3> received request message <<"java client send message">>
3> socket close
3> inet:i().
Port Module Recv Sent Owner Local Address Foreign Address State
2068 inet_tcp 0 0 <0.30.0> *:9999 *:* ACCEPTING
2069 inet_tcp 29 18 <0.30.0> CONNECTED
Port Module Recv Sent Owner Local Address Foreign Address State
ok
4>
[b]Erlang client 端结果:[/b]
D:\temp\socket>erl
Eshell V5.8.4 (abort with ^G)
1> tcp_test:client().
result: <<"process successful">>
ok
2>
[b]Java client 端结果:[/b]
D:\temp\socket>javac Client.java
D:\temp\socket>java Client
process successful
D:\temp\socket>