下面的代码确实适用于gen_tcp:connect()函数调用中的{packet,0}选项,但不适用于1、2和4(尽管我只测试了4,我假设1和2也不起作用)。我的问题是为什么不使用一个而不是另一个重要吗?基本上,Erlang文档没有详细说明有关数据包选项的主题,JoeArmstrong的ProgrammingErlang也没有提供任何详细信息;他只是解释说数据包没有按顺序重新组装,尽管我一直认为tcp数据包在发送时就被接收到,这与UDP不同。我有一个有趣的注意事项是thispage上的客户端服务器有{packet,4}作为选项,它工作正常并且与下面的代码非常相似。这是下面代码中使用的{
考虑以下(基于LYSE的sockserv)%%%Thesupervisorinchargeofallthesocketacceptors.-module(tcpsocket_sup).-behaviour(supervisor).-export([start_link/0,start_socket/0]).-export([init/1]).start_link()->supervisor:start_link({local,?MODULE},?MODULE,[]).init([])->{ok,Port}=application:get_env(my_app,tcpPort),{ok,
我正在尝试通过TCP套接字接收一些数据。当我运行下面的代码时,我得到了输出:localhost^V^A^@,我知道如果使用二进制发送数据,你需要转换数据,但因为我发送的是一个列表,我认为它会被同样地接收到?为什么Host字符串显示正确,而其他数据却显示不正确?非常感谢任何帮助,谢谢。cell_process(Port,X,Y)->Host="localhost",Data=[Host,Port,X,Y],{ok,Socket}=gen_tcp:connect(Host,22,[list,{packet,0}]),ok=gen_tcp:send(Socket,Data),ok=gen_t
有没有办法在Erlang中为tcp连接获取客户端的ip地址?基于客户端连接到服务器的假设?我还想知道是否有必要向特定客户端发送特定数据包;就像服务器没有广播的情况一样,但是我需要ip地址来将数据包发送到特定的客户端,还是服务器只是为每个客户端使用一个引用(erlang:monitor)? 最佳答案 对于另一端的地址,inet:peername(Socket).然而,如果你想处理TCP对话中的每个客户端,一旦每个客户端连接,通常,你会产生单独的erlang进程来处理它,然后TransfertheSocketOwnership到产生的过
我需要通过tcp在nodejs和erlang进程之间传递数据。Erlang进程是一种api服务器,它从nodejs进程接收数据并进行一些处理。我想到了使用json作为数据结构,并且正在使用ejson来编码/解码消息。但是,在进行基准测试时,我发现解码速度非常慢。大约20k消息/秒。有没有更好或更快的方法通过tcp将数据发送到erlang。有没有办法让我可以在erlang中跳过这个解码过程。目前数据是这种类型的:{“事件”:“某事件”,"channel":"一些channel",erlang将使用事件和channel基于它进行一些处理。 最佳答案
我正在编写按照协议(protocol)运行的erlangtcp-server。每个数据包正好有4个字节大小。有一个特例数据包->.此数据包表明,服务器必须读取下一个PayloadLength字节的原始数据。当然,我可以接收原始数据流并在erlang代码中解析此协议(protocol)。但是我想知道,有没有办法使用内置的erlang包打包?当我的数据包以其长度开头时,我可以说[{packet,HeaderLength}]。有什么办法可以强制erlang自动将接收到的数据按4字节的chuks打包吗?UPD:我打算使用{active,once}模式。我也可以使用gen_tcp:recv(So
“ProgrammingErlangSoftwareforaConcurrentWorld”说写一个并行的TCP服务器做这样的:start_parallel_server()->{ok,Listen}=gen_tcp:listen(...),spawn(fun()->par_connect(Listen)end).par_connect(Listen)->{ok,Socket}=gen_tcp:accept(Listen),spawn(fun()->par_connect(Listen)end),loop(Socket).loop(...)->%%handlerequesthere当s
正如标题所说,我有一个用Erlang编写的服务器,一个用Java编写的客户端,它们通过TCP进行通信。我面临的问题是gen_tcp:recv显然不知道何时收到来自客户端的“完整”消息,因此将其“拆分”为多条消息。这是我正在做的一个例子(不完整的代码,试图只保留相关部分):代码二郎服务器-module(server).-export([start/1]).-define(TCP_OPTIONS,[list,{packet,0},{active,false},{reuseaddr,true}].start(Port)->{ok,ListenSocket}=gen_tcp:listen(Po
我在erlang中有一个使用tcp的基本客户端服务器。如何将文件中的实际二进制数据发送给请求它的客户端?文件是如何分段发送的?我有这个代码{好的,套接字}=gen_tcp:connect({Ip},2345,[二进制,{数据包,4}]),这个{packet,4}是否处理双向发送的数据大小?此外,客户端如何接收数据然后对其进行处理?喜欢将其保存到文件吗?谢谢 最佳答案 是-{packet,4}将导致erlang在接收时需要一个4字节无符号大端整数长度值的数据包帧,并在发送每个数据包之前发出一个。您可以通过调用gen_tcp:send(
在下面的代码中,服务器正在监听端口2345。在接受来自客户端的连接后,它返回{ok,Socket}start()->{ok,Listen}=gen_tcp:listen(2345,[binary,{packet,4},{reuseaddr,true},{active,true}]),{ok,Socket}=gen_tcp:accept(Listen).我想获取客户端的IP和端口,如何通过socket解析获取? 最佳答案 使用inet:peername/1。文档中函数的描述:peername(Socket)->{ok,{Address