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

jar*_*ryd 2 binary erlang tcp

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

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

如何将文件分块发送?

我有这个代码

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

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

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

谢谢

arc*_*lus 9

是 - {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).
Run Code Online (Sandbox Code Playgroud)

所以如果您的文件小于4Gb,您可以通过执行来发送它

{ok, File} = file:read_file(FileName),
gen_tcp:send(Socket, File).
Run Code Online (Sandbox Code Playgroud)

在接收端:

File = gen_tcp:recv(Socket, 0).
Run Code Online (Sandbox Code Playgroud)

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