【问题标题】:Receive binary data from a TCP server and save it to a file从 TCP 服务器接收二进制数据并将其保存到文件中
【发布时间】:2010-11-04 23:53:49
【问题描述】:

TCP 客户端如何接收它从 TCP 服务器请求的二进制数据?

如果服务器发送请求的数据(文件某个位置的一些二进制数据)如何接收并保存到文件中。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    这是一个连接到远程服务器、接收数据并将其写入文件的示例:

    -module(recv).
    
    -export([example/1]).
    
    recv_data(IoDevice, Sock) ->
      case gen_tcp:recv(Sock, 0) of
        {ok, B} -> 
          ok = file:write(IoDevice, B),
          recv_data(IoDevice, Sock);
        {error, Reason} ->
          error_logger:info_msg("Done receiving data: ~p~n", [Reason]),
          file:close(IoDevice),
          gen_tcp:close(Sock)
      end.
    
    example(FileName) ->
      {ok, IoDevice} = file:open(FileName, [write, binary]),
      {ok, Sock} = gen_tcp:connect("www.google.com", 80, [binary, {packet, raw}, {active, false}]),
      ok = gen_tcp:send(Sock, "GET / HTTP/1.0\r\n\r\n"),
      recv_data(IoDevice, Sock).
    

    这将连接到 google 并将响应写入文件:

    Erlang R14A (erts-5.8) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
    
    Eshell V5.8  (abort with ^G)
    1> c(recv).
    {ok,recv}
    2> recv:example("/tmp/test.bin").
    
    =INFO REPORT==== 4-Nov-2010::08:52:59 ===
    Done receiving data: closed
    ok
    3> 
    

    【讨论】:

    • 谢谢。如果我想从发件人那里获取数据并存储它怎么办。这条线会有什么不同? ok = gen_tcp:send(Sock, "GET / HTTP/1.0\r\n\r\n") 我不知道为什么 gen_tcp:send 的第二个参数是这样的。 erlang 文档说“一些数据”,当它来自对等方时,我该如何选择这些数据是什么?
    • 从发送方接收数据并存储在文件中。 gen_tcp:send 调用只是要求 google.com,在这种情况下,向我们发送数据。
    • 谢谢。如果我想向上传者询问特定文件中的一段数据怎么办?
    • 嗯,这可能是一个自定义协议。所以你必须自己设计。
    【解决方案2】:

    您使用gen_tcp:recv 接收数据。然后,普通的write 可以将它们保存到文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多