【发布时间】:2017-04-01 11:52:59
【问题描述】:
我是 Erlang 的新手,我正在通过使用纯 Erlang 构建一个非常小的聊天程序来学习。
我希望客户端能够连接到服务器,然后相互发送消息。但这一切都是在本地机器上完成的,而不是为了学习而通过网络完成的。
我有一个连接到服务器的所有客户端的列表。
如果客户端 A 向客户端 B 发送消息,我会在客户端 A 的终端中获得所需的输出,但我不知道如何从客户端 A 获取消息以显示在客户端 B 的终端上。
或者我必须为每个客户端设置自己的迷你服务器
-module(server).
-export([start/0]).
-export([server/1]).
-export([connect/0]).
-export([sendMessage/2]).
%%
%% The Server
%%
start() ->
EmptyList = [],
Pid = spawn(server, server, [EmptyList]),
register(chatServe, Pid).
server(ListOfClients) ->
receive
{Client, connect} ->
Client ! {chatServe, connected},
List = clientList(ListOfClients, Client),
server(List);
{Client, message, MessageBody} ->
List = ListOfClients,
lists:foreach(fun(X) -> X ! {chatServe, new_message, MessageBody} end, List),
Client ! {chatServe, received},
server(List)
end.
%%
%% The client will call rpc:call(server@local, server, connect, [])
%% to connect
%%
connect() ->
chatServe ! {self(), connect},
receive
{chatServe, connected} -> connected
end.
%%
%% The send message method takes two args
%%
%%
sendMessage(SendTo, MessageBody) ->
chatServe ! {self(), message, MessageBody},
receive
{chatServe, received} -> received
end.
receiveMessage(SendTo, SendFrom, MessageBody) ->
receive
{}
end.
%%
%% Some helper functions
%%
clientList(List, Client) when length(List) =:= 0 ->
io:format("List Size = 1~n"),
[Client];
clientList(List, Client) ->
io:format("List size = ~p~n", [length(List) + 1]),
[Client | List].
forwardMessage(SendTo, SentFrom, MessageBody, [H | T]) when H =:= SendTo ->
SendTo ! {SentFrom, message, MessageBody};
forwardMessage(SendTo, SentFrom, MessageBody, [H | T]) ->
forwardMessage(SendTo, SentFrom, MessageBody, T);
forwardMessage(SendTo, SentFrom, MessageBody, []) -> [].
在我正在调用的客户端的终端中 rpc:call(host, mod, function, args).
所以我的问题是如何让客户端 A 通过服务器 C 向客户端 B 发送消息,客户端 A 显示成功,客户端 B 显示已发送的消息?
提前致谢
【问题讨论】:
-
不是一个答案,但我在这里放了一个与一些 cmets 聊天的例子github.com/pascalchap/minichat
-
@Pascal 感谢您的回复。似乎您为每个客户端使用了一个监听循环。是的,这是有道理的。
标签: erlang ipc erlang-shell