- 浏览: 571870 次
- 性别:
- 来自: 广州杭州
文章分类
最新评论
-
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 2779新的ubuntu系统会缺少一些工具 和lib. 用apt-ge ... -
emulator调试日志: driver篇
2007-10-08 16:35 2273--------- driver篇 ------------- ... -
修正Programming Erlang中linked driver实例的小问题
2007-10-08 14:50 2445也许很多人碰上过, 用example1_lid:sta ... -
emulator调试日志: port篇
2007-10-06 16:14 2370------------------ port 篇 ----- ... -
supervisor一小技巧
2007-09-04 13:20 1776simple_one_for_one可以让supervisor ... -
gen_server
2007-08-29 21:52 1898State用来存数据, 任何erlang term都行 ge ... -
application
2007-08-29 02:01 1715用pman 可以看出application controlle ... -
epmd源码学习
2007-07-26 10:14 1998注: 此处节点是指分布式中分布在各终端的点, 而结点是指存在数 ... -
Tracing和dbg
2007-07-15 21:49 2531代码不必用特殊的标记(比如debug_info)来编译,也可以 ... -
ets,dets与大数据存储
2007-07-15 12:49 4930ets与dets都是用来存大数据的机制 ets是Erl ... -
用telnet来与ejabberd交互
2007-07-11 15:41 3195看了一篇文章,觉得用telnet来调试ejabberd也是一种 ... -
ejabberd管理页面和客户端
2007-07-11 00:23 9719转战到97机器。在ejabber.config加上这么一行. ... -
ejabberd在linux平台的安装与配置
2007-07-05 21:17 11919这些天捣鼓了下ejabberd,准备研究它的代码,做为榜样~ ... -
mnesia相关笔记
2007-06-29 12:17 2310当前版本OTP 5.5的mensia建表的表名可以和记录名不一 ... -
OTP设计原则:应用
2007-06-27 00:32 19047 Applications This chapter sh ... -
erlang网络编程的几个性能调优和注意点
2007-06-26 09:56 17845前些天给echo_server写了 ... -
erlc
2007-06-24 15:08 3798erlc 命令 erlc 概要 编译器 描述 Th ... -
echo_server
2007-06-23 14:45 2434代码 -module(echo_server ... -
OTP设计原则:Supervisor行为
2007-06-22 12:15 27025 Supervisor Behaviour This s ... -
OTP设计原则:Gen_Event 行为
2007-06-22 11:59 19844 Gen_Event 行为 这一章应该与gen_event ...
相关推荐
快捷命令,erlang开发调试接口,方便新手快速开发
erlang-erl_interface-19.3.6.4-1.el7.x86_64.rpm
使用erlang进行UDP测试
erl_to_html 使用解析变换和erl_id_trans.erl Erlang的代码转换为HTML,跨度的一切。...我不知道我需要怎么做许可证,但是由于我是从Erlang示例代码中复制erl_id_trans.erl,因此我正在使用Erlang公共许可证。
NULL 博文链接:https://langzhe.iteye.com/blog/965591
joi_230707_7.7.0_44416_share-2ERL05.apk
erl最新版本,erl 23版本 和24版本 属于大版本更新了,有些23版本高性能模块已经不适用24版本,我博客有说明,需要的可以去主页看下。
错误默认该项目旨在包括大量用于调试,开发和测试erlang项目的帮助程序。user_default user_default是一个文件,可以在其中调用所有导出的函数而无需从外壳程序获取模块前缀的情况。 有关user_default的文档,请在...
"candy.erl","dungeon_game.erl", "interleaving_string.erl","search_insert_position.erl", "three_sum.erl","trapping_rain_water.erl", "valid_palindrome.erl" 个人认为dungeon_game这个题目解题逻辑很体现...
erlang 22.3版本 erlang_otp_src_22.3 安装说明https://blog.csdn.net/tangcv/article/details/111841082
erlang-erl_docgen-19.3.6.4-1.el7.x86_64.rpm
rabbitMq3.8.15+erl64_23.0
好东西,一个erlang并行编译的源码。通过对make.erl(otp/lib/tools/src/make.erl)进行修改,提供一个支持多进程编译的mmake.erl。其接口和make.erl相似,只是第一个参数为并发编译数
档案文件./src/player_app.erl顶级应用程序模块./src/player_sup.erl顶级主管模块./src/player_serv.erl一个播放器服务器,与player_sync_serv.erl一起构成Spridon消息交换算法的核心部分./src/player_sync_serv.erl...
如何使代码适应您的需求: 为了使mock_apn工作,您必须: 更改src/mock_apn_sup.erl中的SSL密钥,密码和证书的值在src/mock_apn_server.erl更改代表无效令牌的列表出于测试目的,您可能还需要相应地更改test/mock_...
世界 Erlang 中的 ISO 国家、语言、货币和脚本定义。...您不能在没有 /usr/share/xml/iso-codes/ 的平台上构建 world_data.erl,例如 Windows,但您可以使用它在任何带有预构建 world_data.erl 的平台上。 总的来说
更改mod_http_offline.erl文件中的'[your-url-here]'字符串。 为了编译这个,我在我的主目录下载了代码并运行: erlc -I /lib/ejabberd/include/ -pa ~/ejabberd/deps/lager/ebin/ mod_http_offline.erl 将 ....
hdr_histogram_erl, 适用于 erlang/otp的高动态范围HDR直方图,tcm LFE hdr_histogram_erl [Gitter](https://badges.gitter.im/Join chat 。svg )! 描述of直方图库是tene直方图实用程序吉尔端口 mac C的Erlang本机...
│ └── get_bin_address_ex.erl ├── priv ├── rebar ├── rebar.config └── src ├── binary_tools.app.src └── binary_tools.erl 5 directories, 7 files get_bin_address_ex模块正在使用...