- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
Erlang server, Java client - TCP messages get split?
(3 个回答)
7年前关闭。
我正在使用 this 中的 socket_server客户端和服务器的教程和以下代码:
服务器:
-module(echo_server).
-export([start/0, loop/1]).
% echo_server specific code
start() ->
spawn(socket_server, start, [?MODULE, 7000, {?MODULE, loop}]).
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Message} ->
Msg = binary_to_term(Message),
case Msg of
start ->
io:format("Got start message on socket ~p.~n", [Socket]),
send_count(Socket, 10),
gen_tcp:close(Socket);
Other ->
io:format("Got message on socket ~p: ~p~n",
[Socket, Other])
end;
{error, closed} ->
io:format("Got closed message on socket ~p.~n", [Socket]),
ok;
Error ->
io:format("Got bad message: ~p on socket ~p.~n", [Error, Socket])
end.
send_count(_Socket, 0) ->
ok;
send_count(Socket, Num) ->
io:format("Sending ~p to ~p.~n", [Num, Socket]),
gen_tcp:send(Socket, term_to_binary(Num)),
send_count(Socket, Num - 1).
-module(echo_client).
-export([start/0, do_stuff/0]).
send(Socket, Msg) ->
gen_tcp:send(Socket, term_to_binary(Msg)).
start() ->
dbg:tracer(),
Pid = spawn(?MODULE, do_stuff, []),
dbg:p(Pid, r).
do_stuff() ->
case gen_tcp:connect("localhost", 7000, [binary, {packet, 0}]) of
{ok, Socket} ->
send(Socket, start),
rx_loop(Socket);
Error ->
io:format("Error connecting to server: ~p~n", [Error])
end.
rx_loop(Socket) ->
receive
{tcp, Socket, Message} ->
Msg = binary_to_term(Message),
io:format("Received message: ~p~n", [Msg]),
rx_loop(Socket)
after 5000 ->
finish_loop(Socket)
end.
finish_loop(Socket) ->
receive
{tcp, Socket, Message} ->
Msg = binary_to_term(Message),
io:format("Received message: ~p~n", [Msg]),
rx_loop(Socket);
{tcp_closed, Socket} ->
io:format("Server terminated connection.~n"),
exit(normal);
Error ->
io:format("Received bad message: ~p~n", [Error]),
rx_loop(Socket)
end.
echo_server:start()
和
echo_client:start()
从同一系统上的不同外壳,按顺序。这是我看到的:
1>echo_server:start().
<0.39.0>
Got start message on socket #Port<0.2041>.
Sending 10 to #Port<0.2041>.
Sending 9 to #Port<0.2041>.
Sending 8 to #Port<0.2041>.
Sending 7 to #Port<0.2041>.
Sending 6 to #Port<0.2041>.
Sending 5 to #Port<0.2041>.
Sending 4 to #Port<0.2041>.
Sending 3 to #Port<0.2041>.
Sending 2 to #Port<0.2041>.
Sending 1 to #Port<0.2041>.
2> echo_client:start().
{ok,[{matched,nonode@nohost,1}]}
3> (<0.41.0>) << {code_server,{module,gen_tcp}}
(<0.41.0>) << {code_server,{module,inet_tcp}}
(<0.41.0>) << {#Ref<0.0.0.74>,{ok,<0.43.0>}}
(<0.41.0>) << {#Ref<0.0.0.76>,
{ok,<<4,0,0,0,2,127,0,0,1,127,0,0,1,0,0,0,3,108,111,99,97,108,
104,111,115,116,0,105,112,54,45,108,111,99,97,108,104,
111,115,116,0,105,112,54,45,108,111,111,112,98,97,99,
107,0>>}}
(<0.41.0>) << {inet_async,#Port<0.2058>,0,ok}
(<0.41.0>) << {inet_reply,#Port<0.2058>,ok}
Received message: 10
3> (<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,10>>}
Received message: 9
3> (<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,9>>}
(<0.41.0>) << {io_reply,<0.25.0>,ok}
Received message: 8
Received message: 5
Received message: 4
Received message: 3
Received message: 2
Received message: 1
3> (<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,8,131,97,7,131,97,6>>} %% <---This guy here
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,5>>}
(<0.41.0>) << timeout
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,4>>}
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,3>>}
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,2>>}
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
(<0.41.0>) << {tcp,#Port<0.2058>,<<131,97,1>>}
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << {tcp_closed,#Port<0.2058>}
(<0.41.0>) << timeout
Server terminated connection.
3> (<0.41.0>) << timeout
(<0.41.0>) << {io_reply,<0.25.0>,ok}
(<0.41.0>) << timeout
lo
上的网络流量,我看到每个倒计时的数字都非常干净的 PSH/ACK 对。我在上面指出的行显示了两个数据包出现在一条消息中:7 和 6。它们作为两个单独的 TCP 数据包通过网络传入。任何人都知道为什么他们会被混在一起或如何解开他们?
最佳答案
为什么它们在接收端被“弄脏”:因为 TCP 是一种流协议(protocol),
并且发送/接收调用不需要与
网络数据包(即使它们通过网络以这种方式到达)。
如何“取消”它们:更改您的 TCP 协议(protocol)以包含消息分隔符,
因此您可以从流中提取消息,而无需知道数据包的位置
边界是;或使用 UDP 而不是 TCP。
关于erlang - gen_tcp smushed 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209261/
我想将主机名和端口从命令行传递给 gen_tcp.connect。 defmodule MyComm.Application do use Application def main(args
在浏览 erlang 应用程序的代码时,我遇到了一个有趣的设计问题。让我描述一下情况,但由于 PIA,我无法发布任何代码,抱歉。 代码结构为 OTP 应用程序,其中两个 gen_server 模块负责
这个问题在这里已经有了答案: Erlang server, Java client - TCP messages get split? (3 个回答) 7年前关闭。 我正在使用 this 中的 soc
有没有办法从 Erlang 中的套接字读取整行,或者我是否需要在 gen_tcp:recv 之上手动实现行缓冲? ? 最佳答案 你有没有试过使用 inet:setopts(Socket, [{pack
我修改了 this server使用 gen_tcp:recv为了将数据包的字节数限制为 50。我注释掉了行 inet:setopts(Socket, [{active, once}]),因为 gen
我很感兴趣 gen_tcp:accept 函数的限制是什么?我的意思是什么是最大并发连接数?或者如何配置? (gen_tcp 设置、ulimit 或其他)get_tcp 每秒可以接受多少连接? 最佳答
简单的问题... 这段代码.. client() -> SomeHostInNet = "localhost" % to make it runnable on one machine
我写了一个简单的http客户端,遇到以下问题,我复制粘贴了do_recv来自官方文档,但它的工作方式很奇怪: do_recv(Sock, Bs) -> case gen_tcp:recv(So
我们有一个 gen_server 进程,它通过创建被动套接字并将其借用给其他进程来管理客户端的被动套接字池。任何其他进程都可以借用套接字,使用该套接字向服务器发送请求,通过 gen_tcp:recv
我有一个监听 Ip:Port 的 TCP 服务器。 listen(Ip, Port) -> Opts = [ binary, {active, false}, {packe
我正在实现一个接受许多并发连接的服务器。 我使用了这个结构: loop(Sock) -> case gen_tcp:accept(Sock) of {ok, CSock} ->
我正在尝试学习 Erlang 来做一些简单但可扩展的网络编程。我基本上想编写一个程序来完成互联网 Backbone 上的服务器所做的事情——但规模较小。我想尝试建立一个带有 Web 可访问服务器的 I
在我输入 gen_ 然后在 erlang shell 中输入 Tab 后,我得到了 gen_server、gen_event,但我没有得到gen_tcp。如何在 Erlang shell 中使用 ge
下面是解释如何使用 gen_tcp 的一个示例的一部分。然而,几乎所有的教程都只会向您展示一个回显服务器,而不会解析真实世界的 HTTP 请求。 handle_connect(Socket,
如何使用 gen_tcp 在 erlang 中发送形式为 [Integer, String] 的消息。 例如:我希望使用 gen_tcp:send/2 通过套接字发送形式为 [25, "Hello"]
我遇到了一个问题。我在 Erlang/OTP 上有一个 iOS 客户端和一个 tcp 服务器。客户端假设通过 GCDAsynchSocket 向服务器发送和接收消息。如果我需要发送消息但它不能作为接受
我正在尝试使用 Erlang gen_tcp 在 Elixir 中通过 TCP 连接接受数据 {:ok, socket} = :gen_tcp.connect("127.0.0.1" ,2000,[:
一些教程,包括这个 Learn You Some Erlang一,显示 OTP 主管将打开并拥有一个 TCP 监听套接字并将其共享给将接受连接的多个工作人员的应用程序。 我的问题是,如何在没有 ter
我正在尝试使用 gen_tcp 模块。有服务器端代码的示例,我遇到了麻烦。 %% First, I bind server port and wait for peer connection {ok,
编辑于 2015-11-25 02:10 我的 ejabberd 版本是 14.12 和 erlang R17B,所以这段代码似乎没用,因为 R17B 中的 erlang:system_info(ot
我是一名优秀的程序员,十分优秀!