home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _9e2187fc398487ab6515b224f5d1e966 < prev    next >
Text File  |  2000-03-23  |  21KB  |  518 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>POE - A Perl Object Environment</TITLE>
  5. <LINK REL="stylesheet" HREF="../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> POE - A Perl Object Environment</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <LI><A HREF="#conceptual overview">CONCEPTUAL OVERVIEW</A></LI>
  26.     <UL>
  27.  
  28.         <LI><A HREF="#events layer">Events Layer</A></LI>
  29.         <LI><A HREF="#i/o layer">I/O Layer</A></LI>
  30.         <LI><A HREF="#object layer">Object Layer</A></LI>
  31.     </UL>
  32.  
  33.     <LI><A HREF="#examples">EXAMPLES</A></LI>
  34.     <UL>
  35.  
  36.         <LI><A HREF="#events layer examples">Events Layer Examples</A></LI>
  37.         <LI><A HREF="#i/o layer examples">I/O Layer Examples</A></LI>
  38.         <LI><A HREF="#object layer examples">Object Layer Examples</A></LI>
  39.         <LI><A HREF="#proofs of concepts">Proofs of Concepts</A></LI>
  40.     </UL>
  41.  
  42.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  43.     <LI><A HREF="#bugs">BUGS</A></LI>
  44.     <LI><A HREF="#authors & copyrights">AUTHORS & COPYRIGHTS</A></LI>
  45.     <UL>
  46.  
  47.         <LI><A HREF="#contributors">Contributors</A></LI>
  48.         <LI><A HREF="#author">Author</A></LI>
  49.     </UL>
  50.  
  51. </UL>
  52. <!-- INDEX END -->
  53.  
  54. <HR>
  55. <P>
  56. <H1><A NAME="name">NAME</A></H1>
  57. <P>POE - A Perl Object Environment</P>
  58. <P>
  59. <HR>
  60. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  61. <UL>
  62. <LI>Linux</LI>
  63. <LI>Solaris</LI>
  64. <LI>Windows</LI>
  65. </UL>
  66. <HR>
  67. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  68. <PRE>
  69.   # Basic usage:</PRE>
  70. <PRE>
  71.   use POE;
  72.   # create initial sessions here
  73.   $poe_kernel->run();
  74.   exit;</PRE>
  75. <PRE>
  76.   # Typical usage:</PRE>
  77. <PRE>
  78.   use POE qw( Wheel::SocketFactory Wheel::ReadWrite
  79.               Driver::SysRW Filter::Line
  80.             );
  81.   # create initial sessions here
  82.   $poe_kernel->run();
  83.   exit;</PRE>
  84. <P>
  85. <HR>
  86. <H1><A NAME="description">DESCRIPTION</A></H1>
  87. <P>The POE distribution contains a handful of different modules, each
  88. doing something different.</P>
  89. <P>When a program uses the POE module, the mandatory POE::Kernel and
  90. POE::Session classes are included.  Other modules may be included in
  91. the parameter to ``use POE''.  POE.pm will prepend ``POE::'' to the
  92. module names for you.</P>
  93. <P>
  94. <HR>
  95. <H1><A NAME="conceptual overview">CONCEPTUAL OVERVIEW</A></H1>
  96. <P>POE's features are separated into three major sections.  Sections are
  97. called ``layers'' in the documentation because each builds atop others.</P>
  98. <PRE>
  99.   +-----------+ +--------------+
  100.   | I/O Layer | | Object Layer |
  101.   +-----------+ +--------------+
  102.        /|\            /|\         Commands (to events layer)
  103.         |              |
  104.         |              |
  105.        \|/            \|/         Events (from events layer)
  106.   +----------------------------+
  107.   |        Events Layer        |
  108.   +----------------------------+</PRE>
  109. <P>Events are also used to pass messages between Sessions.</P>
  110. <P>This is a description of each layer, starting with the lowest and
  111. working upwards:</P>
  112. <P>
  113. <H2><A NAME="events layer">Events Layer</A></H2>
  114. <P>POE's events layer consists of two classes.  These classes are always
  115. included when a program uses POE.  They may also be used separately
  116. wherever their exported constants are needed.</P>
  117. <P>POE::Kernel contains the state transition event queue and functions to
  118. manage resources (including events).  Later on, these functions will
  119. be referred to as ``resource commands''.  The Kernel will generate
  120. events to indicate when watched resources (via a resource command)
  121. become active.</P>
  122. <P>POE::Session instances are state machines.  They consist of bundles of
  123. related states.  States may be code references, object methods or
  124. package subroutines.  States are invoked whenever a queued transition
  125. event is dispatched.  State transitions may be enqueued by states
  126. themselves or by active resources.</P>
  127. <P>
  128. <H2><A NAME="i/o layer">I/O Layer</A></H2>
  129. <P>The I/O layer contains one or more libraries that abstract file I/O.
  130. Currently there is only one abstraction library, fondly known as
  131. ``Wheels''.  The ``Wheels'' abstraction consists of groups of classes.</P>
  132. <P>One type of object does only low-level file I/O.  These are the Driver
  133. objects.</P>
  134. <P>A second type of object translates between raw octet streams and
  135. protocol packets.  These are the Filter objects.</P>
  136. <P>The final type of object provides a functional interface to file I/O,
  137. as well as the select logic to glue Drivers and Filters together.
  138. These are the Wheel objects.</P>
  139. <P>Here is a rough picture of the Wheels I/O abstraction:</P>
  140. <PRE>
  141.   +----------------------------------------------------------+
  142.   | Session                                                  |
  143.   |                                                          |
  144.   | +------------+  +-------+     +--------+    +--------+   |
  145.   | |States      |  |       |     |        |    |        |   |
  146.   | |            |  |       |     |        |    |        |   |
  147.   | |Command     |  |       |     | Filter |    |        |   |
  148.   | |events    --|->|       |<--->|        |--->|        |   |
  149.   | |            |  | Wheel |     |        |    | Driver |   |
  150.   | |Functions --|->|       |     +--------+    |        |<--|--> File 
  151.   | |            |  |       |                   |        |   |
  152.   | |Response    |  |       |-> Select Events ->|        |   |
  153.   | |events    <-|--|       |                   |        |   |
  154.   | +------------+  +-------+                   +--------+   |
  155.   |   |   /|\         |  /|\                                 |
  156.   |   |    |          |   |                                  |
  157.   +---|----|----------|---|----------------------------------+
  158.       |    |          |   |
  159.       |    |          |   |   Commands (Session -> Kernel)
  160.       |    |          |   |   & Events (Kernel -> Session)
  161.      \|/   |         \|/  |
  162.   +----------------------------------------------------------+
  163.   |                                                          |
  164.   |                          Kernel                          |
  165.   |                                                          |
  166.   +----------------------------------------------------------+</PRE>
  167. <P>
  168. <H2><A NAME="object layer">Object Layer</A></H2>
  169. <P>The Object layer consists of one or more libraries that implement
  170. code objects.  Currently there are two ways code objects can be
  171. created.</P>
  172. <P>First, code may exist as plain Perl subroutines, objects and
  173. packages.  This is the oldest object layer, and it is often the best
  174. for most programming tasks.</P>
  175. <P>The second object layer is still in its infancy.  Right now it
  176. consists of four classes:</P>
  177. <P>Curator.  This is the object manager.  It embodies inheritance,
  178. attribute fetching and storage, method invocation and security.</P>
  179. <P>Repository.  This is the object database.  It provides a consistent
  180. interface between the Curator and whatever database it hides.</P>
  181. <P>Object.  This is a Perl representation of a Repository object.  It
  182. hides the Curator and Repository behind an interface that resembles a
  183. plain Perl object.</P>
  184. <P>Runtime.  This is a namespace where Object methods are run.  It
  185. contains the public functions from Curator, Repository and Object, and
  186. it may one day run within a Safe compartment.</P>
  187. <P>The obligatory ASCII art:</P>
  188. <PRE>
  189.   +--------------------------------------------------+
  190.   |                     Runtime                      |
  191.   | +----------------+                               |
  192.   | | Object Methods |-------> Public Functions      |
  193.   | +----------------+                               |
  194.   |   /|\                          |                 |
  195.   +----|---------------------------|-----------------+
  196.        |                           |
  197.        | Events                    |  Commands
  198.        |                          \|/
  199.   +--------------------------------------------------+
  200.   |                                                  |
  201.   |  +------------+     Curator                      |
  202.   |  |            |                                  |
  203.   |  |  Sessions  |  +-------------------------------+
  204.   |  |            |  |
  205.   |  +------------+  |   +------------+   +--======--+
  206.   |    /|\     |     |<->| Repository |<->| Database |
  207.   +-----|------|-----+   +------------+   +--======--+
  208.         |      |
  209.         |      |   Events & Commands
  210.         |     \|/
  211.   +--------------------------------------------------+
  212.   |                                                  |
  213.   |                      Kernel                      |
  214.   |                                                  |
  215.   +--------------------------------------------------+</PRE>
  216. <P>
  217. <HR>
  218. <H1><A NAME="examples">EXAMPLES</A></H1>
  219. <P>As of this writing there are 24 sample programs.  Each illustrates and
  220. tests some aspect of POE use.  They are included in the POE
  221. distribution archive, but they are not installed.  If POE was
  222. installed via the CPAN shell, then you should be able to find them in
  223. your .cpan/build/POE-(version) directory.</P>
  224. <P>
  225. <H2><A NAME="events layer examples">Events Layer Examples</A></H2>
  226. <P>These sample programs demonstrate and exercise POE's events layer and
  227. resource management functions.</P>
  228. <UL>
  229. <LI>
  230. create.perl
  231. <P>This program is essentially the same as sessions.perl, but it uses the
  232. newer &POE::Session::create constructor rather than the original
  233. &POE::Session::new constructor.</P>
  234. <P></P>
  235. <LI>
  236. forkbomb.perl
  237. <P>This program is an extensive test of Session construction and
  238. destruction in the kernel.  Despite the name, it does not use fork(2).
  239. By default, this program will stop after about 200 sessions, so it
  240. shouldn't run away with machines it's run on.</P>
  241. <P>Stopping forkbomb.perl with SIGINT is a good way to test signal
  242. propagation.</P>
  243. <P></P>
  244. <LI>
  245. names.perl
  246. <P>This program demonstrates the use of session aliases as a method of
  247. ``daemonizing'' sessions and communicating between them by name.  It
  248. also shows how to do non-blocking inter-session communication with
  249. callback states.</P>
  250. <P></P>
  251. <LI>
  252. objmaps.perl
  253. <P>This is a version of objsessions.perl that maps states to differently
  254. named object methods.</P>
  255. <P></P>
  256. <LI>
  257. objsessions.perl
  258. <P>This program is essentially the same as sessions.perl, but it uses
  259. object methods as states instead of inline code references.</P>
  260. <P></P>
  261. <LI>
  262. packagesessions.perl
  263. <P>This program is essentially the same as sessions.perl, but it uses
  264. package functions as states instead of inline code references.</P>
  265. <P></P>
  266. <LI>
  267. piong.perl
  268. <P>This is a quick and dirty multiple-host icmp ping program.  It
  269. requires two common vt100 escape codes (``\e[2J'' to clear the screen
  270. and ``\e[0;0H\'' to home the cursor).  It needs to be run by root, since
  271. it expects to open a raw socket.</P>
  272. <P>I thank Russell Mosemann <<A HREF="mailto:mose@ccsn.edu">mose@ccsn.edu</A>> for the Net::Ping module,
  273. which I ``borrowed'' heavily from.  Net::Ping is the route of choice if
  274. you don't need parallel ping capability.</P>
  275. <P></P>
  276. <LI>
  277. selects.perl
  278. <P>This program exercises the POE::Kernel interface to select(2).  It
  279. creates a simple chargen server, and a simple client to visit it.  The
  280. client will disconnect after receiving a few lines from the server.
  281. The server will remain active, and it will accept telnet connections.</P>
  282. <P></P>
  283. <LI>
  284. sessions.perl
  285. <P>This program is a basic test of Session construction, destruction and
  286. maintenance in the Kernel.  It is much more friendly than
  287. forkbomb.perl.  People who are new to POE may want to look at this
  288. test first.</P>
  289. <P></P>
  290. <LI>
  291. signals.perl
  292. <P>This program is a basic test of the POE::Kernel interface to system
  293. and Session signals.  It creates two sessions that wait for signals
  294. and periodically send signals to themselves.</P>
  295. <P></P></UL>
  296. <P>
  297. <H2><A NAME="i/o layer examples">I/O Layer Examples</A></H2>
  298. <P>These sample programs demonstrate and exercise POE's default I/O
  299. layer.</P>
  300. <UL>
  301. <LI>
  302. fakelogin.perl
  303. <P>This program tests the ability for POE::Wheel instances to change the
  304. events they emit.  The port it listens on can be specified on the
  305. command line.  Its default listen port is 23.</P>
  306. <P></P>
  307. <LI>
  308. filterchange.perl
  309. <P>This program tests the ability for POE::Wheel instances to change the
  310. filters they use to process information.</P>
  311. <P></P>
  312. <LI>
  313. followtail.perl
  314. <P>This program tests POE::Wheel::FollowTail, a read-only wheel that
  315. follows the end of an ever-growing file.</P>
  316. <P>It creates 21 sessions: 10 log writers, 10 log followers, and one loop
  317. to make sure none of the other 20 are blocking.  SIGINT should stop
  318. the program and clean up its /tmp files.</P>
  319. <P></P>
  320. <LI>
  321. httpd.perl
  322. <P>This program tests POE::Filter::HTTPD by implementing a very basic web
  323. server.  It will try to bind to port 80 of every available interface,
  324. and it will not run if something has already bound to port 80.  It
  325. will accept a new port number on the command line:</P>
  326. <PRE>
  327.   ./httpd.perl 8080</PRE>
  328. <P></P>
  329. <LI>
  330. ref-type.perl
  331. <P>This program tests the ability for POE::Filter::Reference to use
  332. specified serialization methods.  It is part of Philip Gwyn's work on
  333. XML based RPC.</P>
  334. <P></P>
  335. <LI>
  336. refsender.perl and refserver.perl
  337. <P>These two programs test POE::Filter::Reference's ability to pass
  338. blessed and unblessed references between processes.  The standard
  339. Storable caveats (such as the inability to freeze and thaw CODE
  340. references) apply.</P>
  341. <P>To run this test, first start refserver, then run refsender.  Check
  342. refserver's STDOUT to see if it received some data.</P>
  343. <P></P>
  344. <LI>
  345. socketfactory.perl
  346. <P>This program tests POE::Wheel::SocetFactory, a high level wheel that
  347. creates listening and connecting sockets.  It creates a server and
  348. client for each socket type it currently supports.  The clients visit
  349. the servers and process some sample transactions.</P>
  350. <P></P>
  351. <LI>
  352. thrash.perl
  353. <P>This program tests the Wheel abstraction's ability to handle heavy
  354. loads.  It creates a simple TCP daytime server and a pool of 5 clients
  355. within the same process.  Each client connects to the server, accepts
  356. the current time, and destructs.  The client pool creates replacements
  357. for destroyed clients, and so it goes.</P>
  358. <P>This program has been known to exhaust some systems' available
  359. sockets.  On systems that are susceptible to socket exhaustion,
  360. netstat will report a lot of sockets in various WAIT states, and
  361. thrash.perl will show an abnormally low connections/second rate.</P>
  362. <P></P>
  363. <LI>
  364. udp.perl
  365. <P>Udp shows how to use UDP sockets with Kernel::select calls.</P>
  366. <P></P>
  367. <LI>
  368. wheels.perl
  369. <P>This program is a basic rot13 server.  It is a basic test of the whole
  370. premise of wheels.</P>
  371. <P></P>
  372. <LI>
  373. wheels2.perl
  374. <P>Wheels2 shows how to use separate input and output filehandles with
  375. wheels.  It's a simple raw tcp socket client, piping between a client
  376. socket and stdio (in cooked mode).</P>
  377. <P></P></UL>
  378. <P>
  379. <H2><A NAME="object layer examples">Object Layer Examples</A></H2>
  380. <P>This program illustrates POE's Object Layer, which is still in early
  381. development.</P>
  382. <UL>
  383. <LI>
  384. olayer.perl
  385. <P>This program demonstrates some of the features of the early Object
  386. Layer implementation.  It's also something of a reference standard, to
  387. make sure that the Object Layer is consistent and usable.</P>
  388. <P></P></UL>
  389. <P>
  390. <H2><A NAME="proofs of concepts">Proofs of Concepts</A></H2>
  391. <P>Proofs of concepts mainly show how to do something with POE.  In some
  392. cases, they prove that the concept is possible, even though it wasn't
  393. considered while POE was being designed.</P>
  394. <UL>
  395. <LI>
  396. poing.perl
  397. <P>Poing is a ping program that can check multiple hosts at the same
  398. time.  Historical information scrolls across the screen in a ``strip
  399. chart'' fashion.  It's great for listening to the seismology of your
  400. local network (no, it's not deliberately a Quake reference).</P>
  401. <P>Poing's event-driven pinger ``borrows'' heavily from Net::Ping.</P>
  402. <P></P>
  403. <LI>
  404. preforkedserver.perl
  405. <P>This program demonstrates a way to write pre-forking servers with POE.
  406. It tends to dump core after a while.  Perl still isn't safe with
  407. signals, especially in a long-running daemon process.</P>
  408. <P>One work-around is to comment out the <CODE>yield('_stop')</CODE> calls (there are
  409. two).  They only exist to cycle the child servers.  That idea was
  410. borrowed from Apache, which only did it to thwart memory leaks.  POE
  411. shouldn't leak memory, so churning the children shouldn't be needed.</P>
  412. <P></P>
  413. <LI>
  414. proxy.perl
  415. <P>This program demonstrates a way to write TCP forwarders with POE.</P>
  416. <P></P>
  417. <LI>
  418. tutorial-chat.perl
  419. <P>This program is a heavily commented ``chat'' program.  It contains a
  420. running narrative of what's going on and is intended to be both
  421. functional and educational.</P>
  422. <P></P></UL>
  423. <P>
  424. <HR>
  425. <H1><A NAME="see also">SEE ALSO</A></H1>
  426. <UL>
  427. <LI>
  428. Events Layer
  429. <P>POE::Kernel; POE::Session</P>
  430. <P></P>
  431. <LI>
  432. I/O Layer
  433. <P>POE::Driver; POE::Driver::SysRW POE::Filter; POE::Filter::HTTPD;
  434. POE::Filter::Line; POE::Filter::Reference; POE::Filter::Stream;
  435. POE::Wheel; POE::Wheel::FollowTail; POE::Wheel::ListenAccept;
  436. POE::Wheel::ReadWrite; POE::Wheel::SocketFactory</P>
  437. <P></P>
  438. <LI>
  439. Object Layer
  440. <P>POE::Curator; POE::Object; POE::Repository; POE::Repository::Array;
  441. POE::Runtime</P>
  442. <P></P></UL>
  443. <P>
  444. <HR>
  445. <H1><A NAME="bugs">BUGS</A></H1>
  446. <P>The Object Layer is still in early design and implementation, so it's
  447. not documented yet.</P>
  448. <P>There are no automated regression tests.</P>
  449. <P>
  450. <HR>
  451. <H1><A NAME="authors & copyrights">AUTHORS & COPYRIGHTS</A></H1>
  452. <P>POE is brought to you by the following people:</P>
  453. <P>
  454. <H2><A NAME="contributors">Contributors</A></H2>
  455. <P>All contributions are Copyright 1998-1999 by their respective
  456. contributors.  All rights reserved.  Contributions to POE are free
  457. software, and they may be redistributed and/or modified under the same
  458. terms as Perl itself.</P>
  459. <UL>
  460. <LI>
  461. Artur Bergman
  462. <P>Artur Bergman is <vogon-solutions.com!artur>.</P>
  463. <P>He has contributed Filter::HTTPD and Filter::Reference.  His
  464. intangible contributions include feedback, testing, conceptual
  465. planning and inspiration.  POE would not be as far along without his
  466. support.</P>
  467. <P></P>
  468. <LI>
  469. Philip Gwyn
  470. <P>Philip Gwyn is <artware.qc.ca!gwynp>.</P>
  471. <P>He has extended the Wheels I/O abstraction to allow filters to be
  472. changed at runtime.  He has enhanced Filter::Reference to support
  473. different serialization methods.  His intangible contributions include
  474. feedback and quality assurance (bug finding).  A lot of cleanup
  475. between 0.06 and 0.07 is a result of his keen eye.  His other eye's
  476. not so bad either.</P>
  477. <P></P>
  478. <LI>
  479. Dave Paris
  480. <P>Dave Paris is <w3works.com!dparis>.</P>
  481. <P>His contributions include testing and benchmarking.  He discovered
  482. some subtle (and not so subtle) timing problems in version 0.05.  The
  483. pre-forking server test was his idea.  Versions 0.06 and later should
  484. scale to higher loads because of his work.</P>
  485. <P></P>
  486. <LI>
  487. Robert Seifer
  488. <P>Robert Seifer is <?!?>.</P>
  489. <P>He contributed entirely too much time, both his own and his
  490. computer's, to the detection and eradication of a memory corruption
  491. bug that POE tickled in Perl.  In the end, his work produced a patch
  492. that circumvents problems found relating to anonymous subs, scope and
  493. @{} processing.</P>
  494. <P></P>
  495. <LI>
  496. Others?
  497. <P>Have I forgotten someone?  Please let me know.</P>
  498. <P></P></UL>
  499. <P>
  500. <H2><A NAME="author">Author</A></H2>
  501. <UL>
  502. <LI>
  503. Rocco Caputo
  504. <P>Rocco Caputo is <netrus.net!troc>.  POE is his brainchild.</P>
  505. <P>Except where otherwise noted, POE is Copyright 1998-1999 Rocco Caputo.
  506. All rights reserved.  POE is free software; you may redistribute it
  507. and/or modify it under the same terms as Perl itself.</P>
  508. </DL>
  509. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  510. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  511. <STRONG><P CLASS=block> POE - A Perl Object Environment</P></STRONG>
  512. </TD></TR>
  513. </TABLE>
  514.  
  515. </BODY>
  516.  
  517. </HTML>
  518.