pan*_*ami 1 string erlang formatting tcp client-server
我有一个客户端和一个服务器,我使用客户端发送一个字符串"Hello",它在服务器端显示为<<"Hello">>.有没有办法简单地转换<<"Hello">>回来"Hello"?我试过用,
String = io_lib:format("~p",[StringIn]),
lists:flatten(String),
Run Code Online (Sandbox Code Playgroud)
但这使得格式<<"Hello">>变成[[60,60,"\"Hello\"",62,62]]......
顺便提一下代码:
-module(ss1).
-compile(export_all).
-import(lists, [reverse/1]).
client() ->
{ok, Socket} = gen_tcp:connect("localhost", 2345,[binary, {packet, 4}]),
ok = gen_tcp:send(Socket, "Hello"),
receive
{tcp,Socket,String} ->
io:format("Client received = ~p~n",[String]),
io:format("Client result = ~p~n",[String]),
gen_tcp:close(Socket)
end.
server() ->
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]),
{ok, Socket} = gen_tcp:accept(Listen),
gen_tcp:close(Listen),
loop(Socket).
loop(Socket) ->
receive
{tcp,Socket,String} ->
io:format("Server received String = ~p~n",[String]),
io:format("Server replying String = ~p~n",[String]),
gen_tcp:send(Socket, String),
loop(Socket);
{tcp_closed, Socket} ->
io:format("Server socket closed~n")
end.
Run Code Online (Sandbox Code Playgroud)
原因是这一行:
{ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4}, {reuseaddr, true}, {active, true}]),
Run Code Online (Sandbox Code Playgroud)
具体来说,原子binary在选项中传递.如果你通过list,你会得到一个常规的字符串.查看文档的gen_tcp:listen/2.
以下代码不起作用的原因:
String = io_lib:format("~p",[StringIn]),
lists:flatten(String), ...
Run Code Online (Sandbox Code Playgroud)
这lists:flatten/1实际上并没有改变 String ; 它返回一个新列表,它是展平其参数的结果.这会有效:
lists:flatten(io_lib:format("~p", [StringIn])).
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |