1,chat_server.erl
-module(chat_server).
-export([start/1]).
-define(TCP_OPTIONS, [list, {packet, 0}, {active, false}, {reuseaddr, true}]).
start(Port) ->
Pid = spawn(fun() -> manage_clients([]) end),
register(client_manager, Pid),
{ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
do_accept(LSocket).
do_accept(LSocket) ->
{ok, Socket} = gen_tcp:accept(LSocket),
spawn(fun() -> handle_client(Socket) end),
client_manager ! {connect, Socket},
do_accept(LSocket).
handle_client(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
client_manager ! {data, Data},
handle_client(Socket);
{error, closed} ->
client_manager ! {disconnect, Socket}
end.
manage_clients(Sockets) ->
receive
{connect, Socket} ->
io:fwrite("Socket connected: ~w~n", [Socket]),
NewSockets = [Socket | Sockets];
{disconnect, Socket} ->
io:fwrite("Socket disconnected: ~w~n", [Socket]),
NewSockets = lists:delete(Socket, Sockets);
{data, Data} ->
send_data(Sockets, Data),
NewSockets = Sockets
end,
manage_clients(NewSockets).
send_data(Sockets, Data) ->
SendData = fun(Socket) ->
gen_tcp:send(Socket, Data)
end,
lists:foreach(SendData, Sockets).
server监听Socket连接,并群发消息到所有的client
2,chat_send_client.erl
-module(chat_send_client).
-export([start/2]).
start(IP, Port) ->
{ok, Socket} = gen_tcp:connect(IP, Port, [binary, {packet, 4}]),
talk(Socket).
talk(Socket) ->
Msg = io:get_line('Input you msg:'),
ok = gen_tcp:send(Socket, term_to_binary(Msg)),
talk(Socket).
send_client用来启动一个client发消息的进程
3,chat_recv_client.erl
-module(chat_recv_client).
-export([start/2]).
start(IP, Port) ->
{ok, Socket} = gen_tcp:connect(IP, Port, [binary, {packet, 4}]),
recv_msg(Socket).
recv_msg(Socket) ->
receive
{tcp, Socket, Bin} ->
Msg = binary_to_term(Bin),
io:format("Received msg: ~p~n", [Msg]),
recv_msg(Socket)
end.
recv_client用来在client端实时显示所有登录聊天室的client发送的消息
4,启动server
Eshell> chat_server:start(9999).
5,启动send和recv两个client进程
$$ client1
Eshell> chat_send_client:start("localhost", 9999).
Eshell> chat_recv_client:start("localhost", 9999).
$$ client2
Eshell> chat_send_client:start("localhost", 9999).
Eshell> chat_recv_client:start("localhost", 9999).
6,交互过程
%% client1/send
Input you msg:我囧
%% client2/send
Input you msg:你囧啥?
%% client1、2/recv
Received msg: "我囧\n"
Received msg: "你囧啥?\n"
分享到:
相关推荐
本篇将深入探讨一个基于Erlang实现的简单聊天室源码,帮助初学者理解Erlang在构建实时通信系统中的应用。 首先,`聊天室需求文件.doc`提供了项目的基本需求,通常会包含聊天室的功能描述、用户交互方式、性能指标等...
Erlang是一种面向并发的、函数式编程语言,特别适合构建高可用性和容错性的分布式系统,如聊天室。在本项目中,我们看到"erlang 聊天室源码"是一个初学者级别的实践项目,开发者花费了两周时间完成,并且在设计上受...
总的来说,这个基于Erlang的gen_tcp聊天室项目是学习并发编程和网络通信的良好实践。通过阅读和分析源代码,我们可以深入理解Erlang的并发特性、gen_tcp的使用方法,以及如何构建分布式、实时的聊天应用。
2. 分布式:Erlang的天然分布式能力使得聊天室服务器能够轻松扩展到多台机器,通过Erlang的分布式节点通信实现数据同步,提高系统的可扩展性和容错性。 3. 错误恢复:Erlang的"let it crash"哲学鼓励快速失败和自我...
在本文中,我们将深入探讨如何使用Erlang构建一个简易的聊天室,主要涉及的关键技术是gen_tcp和gen_server。Erlang是一种并发性极强、面向进程的编程语言,特别适合于构建高可用性和可扩展性的分布式系统,如聊天室...
此项目由本人入门Erlang过程中编写,前期了解Erlang这门语言如何使用Socket和进程的调用,以及各种Erlang的语法和函数式编程的一个大致了解,可以用于入门参考参考,个人见解,希望大家也可以从我的代码当中发现问题...
【基于Erlang VM的语言】 Erlang虚拟机(Erlang VM,也称为BEAM虚拟机)是Erlang编程语言的核心组成部分,它为Erlang提供了强大的并发特性和故障容错能力。基于Erlang VM的语言充分利用了这些优势,同时也引入了...
这里我们探讨的是一个使用Erlang编程语言和Mochiweb框架实现的聊天室。Erlang是一种面向并发、分布式计算的语言,因其在处理高并发和容错性方面的优秀特性而被广泛应用于电信、金融以及互联网服务等领域。Mochiweb则...
"erlang简单聊天练习"中提到的"只用到了简单的node消息交互"指的是利用Erlang的节点间消息传递机制来实现聊天功能。这种通信方式基于Erlang的进程间通信(IPC, Inter-Process Communication),通过`send`和`receive...
本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的聊天应用程序。这个聊天程序可能包括客户端和服务器端的组件,允许用户通过Erlang或Java环境进行实时通信。 **...
本文将深入探讨Erlang中的TCP和UDP socket编程,以及如何实现简单的echo服务器和客户端。 首先,我们需要了解Erlang中处理TCP socket的gen_tcp模块。gen_tcp模块提供了用于创建TCP连接的接口,它允许我们监听端口、...
Erlang的timer实现机制基于Erlang的进程模型。每个定时器实际上都是一个单独的进程,当设置定时器时,Erlang调度器会在后台创建一个进程来跟踪时间。这个进程会在预定的时间点唤醒,执行相应的操作,如发送消息或...
在给定的文件内容中,通过Erlang语言实现了KMP算法,以下是从文件内容中提取的关键知识点: 1. kmp_search/2函数:这是KMP算法的主函数,用于检查子串(SubString)是否存在于主串(String)中。该函数调用了kmp_...
Erlang零成本实现云计算,为初学者提供参考和学习,并为企业建设云提供帮助
5. **并发处理**:Erlang的进程模型使得并发处理变得简单且高效,每个gen_server实例可以独立处理文件请求,避免了单点性能瓶颈。在高负载情况下,这种设计可以确保系统的稳定性和响应速度。 6. **分布式特性**:...
Erlang emulator 实现分析Erlang emulator 实现分析
Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。函数式编程强调数据不可变性和函数的数学属性,使代码更易于理解、测试和并行处理。 ### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发...
基于Erlang的即时通讯系统的设计与实现