我在erlang中有一个使用tcp的基本客户端服务器。
如何将文件中的实际二进制数据发送给请求它的客户端?
如何将文件分批发送?
我有这段代码
{ok, Socket} =
gen_tcp:connect({Ip}, 2345,
[binary, {packet, 4}]),
这个{packet,4}是否处理双向发送的数据大小?
此外,客户端如何接收数据然后对其执行某些操作?喜欢把它保存到文件中吗?
由于
答案 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}
框架,您将获得完整的文件。