`
hideto
  • 浏览: 2675006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang基于Socket实现简单聊天室

阅读更多
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"
分享到:
评论
3 楼 qq641205389 2011-12-20  
很受用,,
2 楼 songqiuming 2011-05-23  
问一句,吧发送端和接受端分开有什么好处么,会不会增加服务器的负担呢?
1 楼 samking630 2011-03-01  
牛人呀

相关推荐

    erlang聊天室源码

    本篇将深入探讨一个基于Erlang实现的简单聊天室源码,帮助初学者理解Erlang在构建实时通信系统中的应用。 首先,`聊天室需求文件.doc`提供了项目的基本需求,通常会包含聊天室的功能描述、用户交互方式、性能指标等...

    erlang 聊天室源码

    Erlang是一种面向并发的、函数式编程语言,特别适合构建高可用性和容错性的分布式系统,如聊天室。在本项目中,我们看到"erlang 聊天室源码"是一个初学者级别的实践项目,开发者花费了两周时间完成,并且在设计上受...

    基于Erlang的gen_tcp聊天室代码,功能完整

    总的来说,这个基于Erlang的gen_tcp聊天室项目是学习并发编程和网络通信的良好实践。通过阅读和分析源代码,我们可以深入理解Erlang的并发特性、gen_tcp的使用方法,以及如何构建分布式、实时的聊天应用。

    erlang 聊天室

    在本文中,我们将深入探讨如何使用Erlang构建一个简易的聊天室,主要涉及的关键技术是gen_tcp和gen_server。Erlang是一种并发性极强、面向进程的编程语言,特别适合于构建高可用性和可扩展性的分布式系统,如聊天室...

    一个我自己学习Erlang的聊天室服务器及客户端代码

    2. 分布式:Erlang的天然分布式能力使得聊天室服务器能够轻松扩展到多台机器,通过Erlang的分布式节点通信实现数据同步,提高系统的可扩展性和容错性。 3. 错误恢复:Erlang的"let it crash"哲学鼓励快速失败和自我...

    Erlang简易聊天室

    此项目由本人入门Erlang过程中编写,前期了解Erlang这门语言如何使用Socket和进程的调用,以及各种Erlang的语法和函数式编程的一个大致了解,可以用于入门参考参考,个人见解,希望大家也可以从我的代码当中发现问题...

    基于Erlang VM的语言

    【基于Erlang VM的语言】 Erlang虚拟机(Erlang VM,也称为BEAM虚拟机)是Erlang编程语言的核心组成部分,它为Erlang提供了强大的并发特性和故障容错能力。基于Erlang VM的语言充分利用了这些优势,同时也引入了...

    基于mochiweb的聊天室

    这里我们探讨的是一个使用Erlang编程语言和Mochiweb框架实现的聊天室。Erlang是一种面向并发、分布式计算的语言,因其在处理高并发和容错性方面的优秀特性而被广泛应用于电信、金融以及互联网服务等领域。Mochiweb则...

    erlang简单聊天练习

    "erlang简单聊天练习"中提到的"只用到了简单的node消息交互"指的是利用Erlang的节点间消息传递机制来实现聊天功能。这种通信方式基于Erlang的进程间通信(IPC, Inter-Process Communication),通过`send`和`receive...

    erlang-java聊天

    本项目“erlang-java聊天”是一个初级水平的示例,展示了如何利用这两种语言进行交互,实现一个简单的聊天应用程序。这个聊天程序可能包括客户端和服务器端的组件,允许用户通过Erlang或Java环境进行实时通信。 **...

    Erlang中的socket编程简单例子

    本文将深入探讨Erlang中的TCP和UDP socket编程,以及如何实现简单的echo服务器和客户端。 首先,我们需要了解Erlang中处理TCP socket的gen_tcp模块。gen_tcp模块提供了用于创建TCP连接的接口,它允许我们监听端口、...

    erlang的timer和实现机制

    Erlang的timer实现机制基于Erlang的进程模型。每个定时器实际上都是一个单独的进程,当设置定时器时,Erlang调度器会在后台创建一个进程来跟踪时间。这个进程会在预定的时间点唤醒,执行相应的操作,如发送消息或...

    KMP(Erlang)代码实现

    在给定的文件内容中,通过Erlang语言实现了KMP算法,以下是从文件内容中提取的关键知识点: 1. kmp_search/2函数:这是KMP算法的主函数,用于检查子串(SubString)是否存在于主串(String)中。该函数调用了kmp_...

    基于erlang的文件存储

    5. **并发处理**:Erlang的进程模型使得并发处理变得简单且高效,每个gen_server实例可以独立处理文件请求,避免了单点性能瓶颈。在高负载情况下,这种设计可以确保系统的稳定性和响应速度。 6. **分布式特性**:...

    Erlang emulator 实现分析

    Erlang emulator 实现分析Erlang emulator 实现分析

    erlang编程 Introducing Erlang

    Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。函数式编程强调数据不可变性和函数的数学属性,使代码更易于理解、测试和并行处理。 ### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发...

    基于Erlang的即时通讯系统的设计与实现_黄明.caj

    基于Erlang的即时通讯系统的设计与实现

Global site tag (gtag.js) - Google Analytics