- 浏览: 578107 次
- 性别:
- 来自: 广州杭州
文章分类
最新评论
-
bohc:
谢谢,搞了两天了,现在才算是找到问题所在,解决了。
文件在使用FileChannel.map后不能被删除(Windows上) -
zhang0000jun:
在jdk1.8中执行正好和楼主的结果相反,请指教
从Java视角理解CPU缓存(CPU Cache) -
在世界的中心呼喚愛:
forenroll 写道请问楼主的那个分析工具cachemis ...
从Java视角理解CPU缓存(CPU Cache) -
xgj1988:
我这里打出的结果是: 0 L1-dcache-load-mis ...
从Java视角理解CPU缓存(CPU Cache) -
thebye85:
请教下大神,为什么频繁的park会导致大量context sw ...
从Java视角理解CPU上下文切换(Context Switch)
java 代码
- %% Copyright (C) 2002, Joe Armstrong
- %% File : tcp_server.erl
- %% Author : Joe Armstrong (joe@sics.se)
- %% Purpose : Keeps track of a number of TCP sessions
- %% Last modified: 2002-11-17
- -module(tcp_server).
- -export([start_raw_server/4, start_client/3,
- stop/1, children/1]).
- -define(KILL_DELAY, 1000).
- %% -export([start_child/3]).
- %% start_raw_server(Port, Fun, Max)
- %% This server accepts up to Max connections on Port
- %% The *first* time a connection is made to Port
- %% Then Fun(Socket) is called.
- %% Thereafter messages to the socket result in messsages to the handler.
- %% a typical server is usually written like this:
- %% To setup a lister
- %% start_server(Port) ->
- %% S = self(),
- %% process_flag(trap_exit, true),
- %% tcp_server:start_raw_server(Port,
- %% fun(Socket) -> input_handler(Socket, S) end,
- %% 15,
- %% 0)
- %% loop().
- %% The loop() process is a central controller that all
- %% processes can use to synchronize amongst themselfves if necessary
- %% It ends up as the variable "Controller" in the input_handler
- %% A typical server is written like this:
- %% input_handler(Socket, Controller) ->
- %% receive
- %% {tcp, Socket, Bin} ->
- %% ...
- %% gen_tcp:send(Socket, ...)
- %%
- %% {tcp_closed, Socket} ->
- %%
- %%
- %% Any ->
- %% ...
- %%
- %% end.
- start_client(Host, Port, Length) ->
- gen_tcp:connect(Host, Port,
- [binary,
- {active, true},
- {packet, 2},
- {packet_size, Length}], 30000).
- %% Note when start_raw_server returns, it should be ready to
- %% Immediately accept connections
- %% 作用
- %% 当start_raw_server返回时, 就可以接受连接啦
- %% 参数
- %% Port 服务器监听端口
- %% Fun 数据处理函数
- %% Max 最大连接数
- %% Length 最大包的长度
- start_raw_server(Port, Fun, Max, Length) ->
- Name = port_name(Port), % 用端口号来命名进程
- case whereis(Name) of
- undefined -> % 如果端口还未定义的话,则启动
- Self = self(),
- Pid = spawn_link(fun() -> % 产生一个新进程
- cold_start(Self, Port, Fun, Max, Length) % 冷启动
- end),
- receive
- {Pid, ok} ->
- register(Name, Pid), % 接收到
- {ok, Pid};
- {Pid, Error} ->
- Error
- end;
- _Pid -> % 如果端口已定义,则报错
- {error, already_started}
- end.
- stop(Port) when integer(Port) ->
- Name = port_name(Port),
- case whereis(Name) of
- undefined ->
- not_started;
- Pid ->
- exit(Pid, kill),
- (catch unregister(Name)),
- stopped
- end.
- children(Port) when integer(Port) ->
- port_name(Port) ! {children, self()}, %
- receive
- {session_server, Reply} -> Reply
- end.
- %% 作用
- %% 以端口号做为服务名称
- %% 参数
- %% 端口号
- port_name(Port) when integer(Port) ->
- list_to_atom("portServer" ++ integer_to_list(Port)).
- %% 作用
- %% 启动服务
- %% 参数
- %% Master 所有者
- %% Port 端口
- %% Fun 处理函数
- %% Max 数大连接数
- %% Length 最大包的长度
- cold_start(Master, Port, Fun, Max, Length) ->
- process_flag(trap_exit, true), % 设置退出陷阱
- io:format("Starting a port server on ~p...~n",[Port]),
- % 绑定到端口,进行监听
- case gen_tcp:listen(Port, [binary,
- %% {dontroute, true},
- {nodelay,true},
- {packet_size, Length},
- {packet, 2},
- {backlog, 1024},
- {reuseaddr, true},
- {active, false}]) of
- {ok, Listen} ->
- %% io:format("Listening on:~p~n",[Listen]),
- Master ! {self(), ok}, % 发送成功消息
- New = start_accept(Listen, Fun), % 开始接受连接
- %% Now we're ready to run
- socket_loop(Listen, New, [], Fun, Max); % 接受连接后,开始网络通信了
- Error ->
- Master ! {self(), Error}
- end.
- %% Don't mess with the following code uless you really know what you're
- %% doing (and Thanks to Magnus for heping me get it right)
- %% 作用
- %% 接受连接后,开始运作
- socket_loop(Listen, New, Active, Fun, Max) ->
- receive
- {istarted, New} ->
- Active1 = [New|Active], % 参见start_child,把新连接加入到活动列表中
- possibly_start_another(false, Listen, Active1, Fun, Max);
- {'EXIT', New, _Why} ->
- %%io:format("Child exit=~p~n",[Why]),
- possibly_start_another(false, Listen, Active, Fun, Max);
- {'EXIT', Pid, _Why} ->
- %%io:format("Child exit=~p~n",[Why]),
- Active1 = lists:delete(Pid, Active),
- possibly_start_another(New, Listen, Active1, Fun, Max);
- {children, From} ->
- From ! {session_server, Active},
- socket_loop(Listen, New, Active, Fun, Max);
- Other ->
- io:format("Here in loop:~p~n",[Other])
- end.
- possibly_start_another(New, Listen, Active, Fun, Max) when pid(New) ->
- socket_loop(Listen, New, Active, Fun, Mzax);
- possibly_start_another(false, Listen, Active, Fun, Max) ->
- case length(Active) of
- N when N < Max ->
- New = start_accept(Listen, Fun),
- socket_loop(Listen, New, Active, Fun, Max);
- _ ->
- error_logger:warning_report(
- [{module, ?MODULE},
- {line, ?LINE},
- {message, "Connections maxed out"},
- {maximum, Max},
- {connected, length(Active)},
- {now, now()}]),
- socket_loop(Listen, false, Active, Fun, Max)
- end.
- %% 作用
- %% 开始接受连接啦
- %% 参数
- %% Listen 监听的Socket
- %% Fun 数据处理函数
- start_accept(Listen, Fun) ->
- S = self(),
- spawn_link(fun() -> start_child(S, Listen, Fun) end). % 一个进程处理一个连接
- start_child(Parent, Listen, Fun) ->
- case gen_tcp:accept(Listen) of % 接受一个连接
- {ok, Socket} ->
- Parent ! {istarted,self()}, % 参见socket_loop, tell the controller
- inet:setopts(Socket, [{nodelay,true},
- {packet, 2},
- {active, true}]), % before we activate socket
- Fun(Socket); % 这里应用了数据处理函数Fun
- _Other ->
- exit(oops)
- end.
发表评论
-
ubuntu安装otp R11B 的一些记录
2007-11-16 12:30 2838新的ubuntu系统会缺少一些工具 和lib. 用apt-ge ... -
emulator调试日志: driver篇
2007-10-08 16:35 2336--------- driver篇 ------------- ... -
修正Programming Erlang中linked driver实例的小问题
2007-10-08 14:50 2495也许很多人碰上过, 用example1_lid:sta ... -
emulator调试日志: port篇
2007-10-06 16:14 2423------------------ port 篇 ----- ... -
supervisor一小技巧
2007-09-04 13:20 1866simple_one_for_one可以让supervisor ... -
gen_server
2007-08-29 21:52 1953State用来存数据, 任何erlang term都行 ge ... -
application
2007-08-29 02:01 1786用pman 可以看出application controlle ... -
epmd源码学习
2007-07-26 10:14 2057注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数 ... -
Tracing和dbg
2007-07-15 21:49 2583代码不必用特殊的标记(比如debug_info)来编译,也可以 ... -
ets,dets与大数据存储
2007-07-15 12:49 4985ets与dets都是用来存大数据的机制 ets是Erl ... -
用telnet来与ejabberd交互
2007-07-11 15:41 3255看了一篇文章,觉得用telnet来调试ejabberd也是一种 ... -
ejabberd管理页面和客户端
2007-07-11 00:23 9794转战到97机器。在ejabber.config加上这么一行. ... -
ejabberd在linux平台的安装与配置
2007-07-05 21:17 11979这些天捣鼓了下ejabberd,准备研究它的代码,做为榜样~ ... -
mnesia相关笔记
2007-06-29 12:17 2370当前版本OTP 5.5的mensia建表的表名可以和记录名不一 ... -
OTP设计原则:应用
2007-06-27 00:32 19747 Applications This chapter sh ... -
erlang网络编程的几个性能调优和注意点
2007-06-26 09:56 17897前些天给echo_server写了 ... -
erlc
2007-06-24 15:08 3881erlc 命令 erlc 概要 编译器 描述 Th ... -
echo_server
2007-06-23 14:45 2476代码 -module(echo_server ... -
OTP设计原则:Supervisor行为
2007-06-22 12:15 27685 Supervisor Behaviour This s ... -
OTP设计原则:Gen_Event 行为
2007-06-22 11:59 20494 Gen_Event 行为 这一章应该与gen_event ...
相关推荐
标题中的"ud.rar_user_default.erl"表明这是一个与Erlang编程语言相关的压缩包,具体是一个名为"user_default.erl"的源代码文件。Erlang是一种面向并发、分布式和容错的编程语言,常用于构建高可用性系统,如电信、...
标题中的“ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议”指出,ejabberd服务器的模块mod_privacy_odbc在处理数据库操作时可能存在与XMPP(可扩展消息处理即时协议)标准不完全一致的问题。ejabberd是一...
sudo cp -r rabbitmq_server-3.7.3 /usr/local/rabbitmq sudo ln -s /usr/local/rabbitmq/sbin/rabbitmq-server /usr/bin sudo rabbitmq-server ``` 在RabbitMQ安装完成后,你可以通过Web管理界面或命令行工具`...
erl -version ``` 6. **设置环境变量**:为了方便后续使用,可以将Erlang的bin目录添加到PATH环境变量中。编辑~/.bashrc或~/.bash_profile文件,添加以下行: ``` export PATH=$PATH:/usr/local/lib/erlang/bin...
1. **源码文件**:Erlang 源代码文件(以 .erl 扩展名结尾),这些文件包含了 OTP 库、模块和函数实现。 2. **Makefiles**:编译指令文件,用于指导如何编译和链接源代码。 3. **文档**:可能包含 HTML 或 PDF 格式...
- 安装完成后,你可以通过运行`erl`命令来启动Erlang shell,如果一切顺利,你应该看到Erlang的欢迎界面。 - 使用`erl -version`可以查看Erlang的版本,确认是否为21.3。 8. **设置环境变量**: - 可能需要将...
3. 安装后,需要将Erlang的bin目录添加到系统的PATH环境变量中,以便命令行可以找到erl等工具。 在安装完成后,可以继续安装RabbitMQ。RabbitMQ的安装通常涉及下载其二进制包,配置环境变量,启动服务,并根据应用...
erl -version ``` Erlang OTP的源码安装允许用户自定义编译选项,比如添加特定的编译标志或链接库,以满足特定需求。同时,源码安装也方便了开发者对Erlang语言和 OTP 库的深入研究。 在实际开发中,Erlang OTP...
7. **启动和管理RabbitMQ**:安装完成后,可以使用`sudo rabbitmq-server start`启动RabbitMQ服务器,`sudo rabbitmq-plugins enable rabbitmq_management`启用管理插件以访问Web管理界面。管理界面默认在`...
标题中的"erl:otp_src_24.0.5.tar.gz"指的是Erlang的源码包,其中"otp_src_24.0.5"是Erlang/OTP (Open Telecom Platform) 的24.0.5版本的源代码。Erlang是一种面向并发的、函数式的编程语言,常用于构建高可用性和...
使用erlang进行UDP测试
错误默认该项目旨在包括大量用于调试,开发和测试erlang项目的帮助程序。user_default user_default是一个文件,可以在其中调用所有导出的函数而无需从外壳程序获取模块前缀的情况。 有关user_default的文档,请在...
OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...
erlang 安装包。 rabbitmq 安装所需要的
Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...
5. 验证安装:安装完成后,可以使用 `erl` 命令来启动 Erlang shell,验证是否正确安装。 完成 Erlang 的安装后,可以继续安装 RabbitMQ。通常,这涉及下载 RabbitMQ 的二进制包或源代码,配置,然后启动服务。在 ...
erl_to_html 使用解析变换和erl_id_trans.erl Erlang的代码转换为HTML,跨度的一切。...我不知道我需要怎么做许可证,但是由于我是从Erlang示例代码中复制erl_id_trans.erl,因此我正在使用Erlang公共许可证。
1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...
erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm