【问题标题】:Erlang: Converting TCP sent string into its proper form e.g. <<"SomeString">> to "SomeString"?Erlang:将 TCP 发送的字符串转换为正确的形式,例如<<"SomeString">> 到 "SomeString"?
【发布时间】:2013-03-08 21:45:22
【问题描述】:

我有一个客户端和一个服务器,我使用客户端发送一个字符串,例如"Hello",它在服务器端显示为&lt;&lt;"Hello"&gt;&gt;。有没有办法简单地将&lt;&lt;"Hello"&gt;&gt; 转换回"Hello"?我试过用,

String = io_lib:format("~p",[StringIn]),
            lists:flatten(String),

但这使得格式 &lt;&lt;"Hello"&gt;&gt; 变成了 [[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.

【问题讨论】:

    标签: string tcp formatting erlang client-server


    【解决方案1】:

    您可以使用函数 - 来自 erlang 模块的 binary_to_list。

      Eshell V5.9.1  (abort with ^G)
    
    1> B = <<"Hello">>.
    <<"Hello">>
    2> erlang:binary_to_list(B).
    "Hello"
    3> 
    

    【讨论】:

      【解决方案2】:

      原因是这一行:

      {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 4},  {reuseaddr, true}, {active, true}]),
      

      具体来说,原子binary 传入选项。如果您改为传递list,您将得到一个常规字符串。对于gen_tcp:listen/2,请参阅documentation

      以下代码不起作用的原因:

      String = io_lib:format("~p",[StringIn]),
      lists:flatten(String), ...
      

      lists:flatten/1 真的没有改变 String;它返回一个新列表,该列表是展平其参数的结果。这会奏效的:

      lists:flatten(io_lib:format("~p", [StringIn])).
      

      【讨论】:

        【解决方案3】:

        如果您只想使用io:formatio_lib:format 打印二进制文件,可以使用~s 格式说明符:

        1> MyBinary = <<"Hello">>.
        <<"Hello">>
        2> io:format("MyBinary is '~s'~n", [MyBinary]).
        MyBinary is 'Hello'
        ok
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-14
          • 2017-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-15
          • 1970-01-01
          相关资源
          最近更新 更多