Erlang基于Socket实现简单聊天室

1,chat_server.erl
[code]
-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).
[/code]
server监听Socket连接,并群发消息到所有的client

2,chat_send_client.erl
[code]
-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).
[/code]
send_client用来启动一个client发消息的进程

3,chat_recv_client.erl
[code]
-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.
[/code]
recv_client用来在client端实时显示所有登录聊天室的client发送的消息

4,启动server
[code]
Eshell> chat_server:start(9999).
[/code]

5,启动send和recv两个client进程
[code]
$$ 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).

[/code]

6,交互过程
[code]
%% client1/send
Input you msg:我囧
%% client2/send
Input you msg:你囧啥?
%% client1、2/recv
Received msg: "我囧\n"
Received msg: "你囧啥?\n"
[/code]
基于Erlang的gen_tcp聊天室代码,功能完整 个人学习Erlang的时候自己写的一个基于gen_tcp的聊天室,功能有注册,登陆,获得登陆时间,聊天次数,上次登陆时间等等,资源里有完整代码,注释也很详细. 立即下载

相关推荐

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

里面包含Server端Erlang代码和Client端JAVA代码。编写过程在我博客里。

Erlang socket编程 基础(一)

前言 发现erlang 网络编程部分的博客写得都挺多的,但比较缺比较全的总结,所以打算写一篇从基础案例到做个游戏网关的文章。erlang 提供了tcp/udp 套接字编程,本系列只讲Tcp相关 服务器和客户端工作方式 服务器 首先,我们打开shell调用 gen_tcp:listen (Port,option)进行监听套接字 1> {ok, ListenSocket} = gen_tcp:listen(8088, [binary,{active,true},{packet,0}].

qq_35218302的博客 943

基于erlang后台,java swing前端开发的qq聊天系统

本系统是基于erlang开发的后台,java swing开发的前端的qq聊天系统,希望能给初学erlang的人带来一点小小的帮助,具体操作步骤见redme.txt文件 功能如下: 功能: 1.用户登录功能,账号和密码从服务端的mysql数据库中验证 2.实现多人聊天功能 3.一个用户上线后,立即通知其他在线用户他已上线,更新图片变亮 4.一个用户下线,立即通知其他在线用户他已下线,更新图片变暗 5.支持离线聊天 6.用户注册功能

Erlang实现handlersocket客户端

handlersocket是mysql的一个插件,实现了nosql的特性,可以使用mysql表的索引, 相对于hbase、memcache等nosql方案,具有更大的灵活性,与memcache相比较,具有以下优势: 1、使用nosql的同时可以使用mysql的所有特性; 2、无memcache的持久化的问题; 3、可以使用mysql的索引,查询时不再是简单的的key->value,可以使用

flyinmind的专栏 1164

erlang 聊天室

基于erlang的简易聊天室,主要技术是通过gen_tcp和gen_servere实现的

erlang聊天室源码

附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块

erlang之三种socket消息循环

转载:高手http://hi.baidu.com/zai215837829/blog/item/2e8323dc3763c02e5982dd80.html 1、主动消息获取(非阻塞) 第一个例子是以主动模式打开socket,然后接受来自socket的数据: {ok,

zhangxinrun的专栏 2374

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 426

基于Erlang开发入门聊天小demo(普通socket(tcp&udp)聊天、otp整合tcp以及websocket聊天、使用Emakefile编译所有项目)及附源码地址、学会入门Erlang

基于Erlang开发入门聊天小demo(普通socket(tcp&udp)聊天、otp框架整合tcp以及websocket聊天、使用Emakefile编译所有项目),详细说明及附源码地址、学会即可入门Erlang)

Tian208的博客 1022

Ubuntu虚拟机IP卡在127.0.0.1?别慌,试试这条万能命令 `sudo dhclient`

本文详细解析了Ubuntu虚拟机IP卡在127.0.0.1的常见原因及解决方案,重点介绍了`sudo dhclient`命令的使用方法及其变体,帮助用户快速恢复网络连接。同时提供了网络诊断工具和预防措施,适用于开发者和系统管理员应对网络故障。

weixin_29251131的博客 283

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

Erlang实现简单聊天室

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} =

翻肚鱼儿的博客 471

6、基因组数据可视化与甲基化分析:从基础操作到深入洞察

本文详细介绍了基因组数据可视化和全基因组DNA甲基化分析的方法和技术,包括基因组查看器(IGV)的基本操作、单核苷酸变异的可视化、DNA甲基化与CpG岛的关联分析、统计建模与显著甲基化区域识别,以及不同细胞系之间的甲基化模式差异分析。通过具体案例展示了如何利用MATLAB进行数据分析和可视化,为基因组研究、疾病机制探索及个性化医疗提供了技术支撑和实践参考。

qsc901234的博客 295

Erlang之简便聊天室

my_tcp.erl -module(my_tcp). -compile(export_all). start_server() -> ets:new(my_ets,[ordered_set, public, named_table, {write_concurrency, true}, {read_concurrency, true}]),%初始化一个表 case gen_tcp...

fbher的博客 593

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

电脑硬件:电脑主板上的接口介绍,看完你就懂了

它们主要用于连接老式的键盘和鼠标,虽然速度和兼容性不如USB接口,但在某些特定场合依然发挥着重要作用。PCIe接口是主板上的扩展能力象征,可以连接各种扩展卡,如显卡、声卡、网卡等。电脑主板作为电脑硬件组成关键的部分,今天给大家分享一下电脑主板上有哪些接口,具体每一个接口的特点、使用场景,有需要的朋友可以来了解一下!它们不仅能连接鼠标、键盘、U盘、打印机,还能连接各种外设,如移动硬盘、游戏手柄等。:虽然现在用得越来越少,但在一些特定场合,如工业控制、老旧设备上,仍然需要使用PS/2接口。

IT技术分享社区 2786

基于erlang语言的socket通信

erlang语言实现socket聊天室关键词 erlang socket erlang语言是函数式编程语言,由Erlang之父Joe Amstrong编写出erlang原型,并在爱立信公司得到大规模应用,进而在通信行业有了一席之地,其优势在于高并发性、容错、高性能。socket是实现数据交互的最普遍的方式,Erlang/OTP中也融合了tcp协议,并通过OTP中的库简单的编程就能实现服务端、客户端的

Mayday 1134

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

erlang socket

目标是验证“将客户端连接的socket绑定到一个gen_server后,发送到socket 的消息将由gen_server的handle_info/2 处理”。              接收客户端socket 连接的server: -module("myserver"). -export([start/2],[stop/0]). start()-> %%监听端口 {ok,

心笑峰的csdn blog 2038

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C#与Erlang的一次Socket通信

注:该节主要是了解Erlang的通信,还没真正开发Erlang聊天室。   功能点: Erlang写服务器,通过接受也仅能接受一次客户端的信息,然后直接返回给客户端。 C#写客户端,硬编码一个字符串“TTTT”,点击发送,发给服务器。 1.服务器端代码 -module(my_tcp_server). -export([server/0]). server(

Timo 1341

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Erlang】基于gen_tcp的聊天室

功能: 服务端记录每一个客户端的ID客户端根据ID与别的客户端交互 代码: -module(tcp). -compile(export_all). -import(ets,[insert_new/2]). %服务端 start_parallel_server() -> %创建一个全局的ets表,存放客户端的id ets:new(id, [ordered_set, publi

ns2250225 3561

Erlang 聊天室程序(二) 客户端的退出

接着上一篇Erlang 聊天室程序(一) 。客户端退出会导致服务器端异常退出。 异常信息如下: client sockt closed ** exception exit: {bad_return_value,true} 显然已经在client_session的 handle_info({tcp_closed,Socket},State) 中捕捉到了Socket断链信息。 h...

心笑峰的csdn blog 305

Erlang 聊天室程序(三) 数据交换格式---json的decode

霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng              为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库              先定义一个Message类: public class Message { String id; //消息ID String type; //消息类型 String fro

心笑峰的csdn blog 4395
上一篇: 最简单的Erlang Socket程序
下一篇: gen_server入门
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值