在erlang中使用tcp发送原始二进制文件

时间:2010-11-02 19:43:46

标签: tcp binary erlang

我在erlang中有一个使用tcp的基本客户端服务器。

如何将文件中的实际二进制数据发送给请求它的客户端?

如何将文件分批发送?

我有这段代码

{ok, Socket} = gen_tcp:connect({Ip}, 2345, [binary, {packet, 4}]),

这个{packet,4}是否处理双向发送的数据大小?

此外,客户端如何接收数据然后对其执行某些操作?喜欢把它保存到文件中吗?

由于

1 个答案:

答案 0 :(得分:8)

是 - {packet, 4}将导致erlang在接收时要求一个4字节无符号大端整数长度值的数据包帧,并在每个数据包发送之前发出一个。

您可以通过调用gen_tcp:send(Socket, Data)在套接字上发送数据。这将做类似的事情:

RawData = iolist_to_binary(Data),
Length = byte_size(RawData),
Packet = <<Length:32/big-unsigned-integer, RawData/binary>>,
send(Socket, Packet).

所以如果您的文件小于4Gb,您可以通过

发送它
{ok, File} = file:read_file(FileName),
gen_tcp:send(Socket, File).

在接收端:

File = gen_tcp:recv(Socket, 0).

由于{packet, 4}框架,您将获得完整的文件。