在两个节点之间传递数据erlang

btxsgosb  于 2023-03-11  发布在  Erlang
关注(0)|答案(1)|浏览(146)

我最近开始学习Erlang,我正在尝试实现一个服务器-客户端示例程序。我创建了一个已注册的进程,我想从另一个进程向它发送数据。代码如下。

-module(mine).
-export([alice/0, bob/2, startAlice/0, startBob/1]).

alice() ->
    receive
        {message, BobNode} ->
            io:fwrite("Alice got a message \n"),
            BobNode ! message,
            alice()
        finished -> io:fwrite("Alice is finished\n")
    end.

bob(0, AliceNode) ->
    {alice, AliceNode} ! finished,
    io:fwrite("Bob is finished\n");

bob(N, AliceNode) ->
    {alice, AliceNode} ! {message, self()},
    receive
        message -> io:fwrite("Bob got a message ~w \n",[N])
    end,
    bob(N-1, AliceNode).

startAlice() ->
    register(alice, spawn(mine, alice, [])).

startBob(AliceNode) ->
    spawn(mine, bob, [30000, AliceNode]).

这里,我想从bob向alice发送一些值,比如N。
bob(N, AliceNode)函数中的{alice, AliceNode, Nvalue} ! {message, self(), N},但得到的错误变量'Nvalue'是未绑定的erl。我确信我在这里遗漏了一些琐碎的东西。任何帮助都将不胜感激。提前感谢。

f87krz0w

f87krz0w1#

参见变更代码:

-module(mine).
-export([alice/0, bob/2, startAlice/0, startBob/1]).

alice() ->
    receive
        {X, BobNode} ->
            io:fwrite("Alice got a message ~w \n",[X]),
            BobNode ! message,
            alice();
        finished -> io:fwrite("Alice is finished\n")
    end.

bob(0, AliceNode) ->
    {alice, AliceNode} ! finished,
    io:fwrite("Bob is finished\n");

bob(N, AliceNode) ->
    {alice, AliceNode} ! {N, self()},
    receive
        message -> io:fwrite("Bob got a message ~w \n",[N])
    end,
    bob(N-1, AliceNode).

startAlice() ->
    register(alice, spawn(mine, alice, [])).

startBob(AliceNode) ->
    spawn(mine, bob, [10, AliceNode]).

我用过erlang:Erlang/OTP 23 [Erts-11.1.8] [源代码] [64位] [smp:4:4] [ds:4:4:10] [异步线程:1]
x一个一个一个一个x一个一个二个x
我认为发送和接收部分应该同步。

{alice, AliceNode, Nvalue} ! {message, self(), N}

需求:

alice() ->
    receive
        {message, BobNode, X} ->
            io:fwrite("Alice got a message ~w \n",[X]),
            BobNode ! message,
            alice();
        finished -> io:fwrite("Alice is finished\n")
    end.

相关问题