<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE org.apache.commons.menus SYSTEM '../../commons-build/menus/menus.dtd'>
<!--
   Copyright 2003-2005 The Apache Software Foundation

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<document>

 <properties>
  <title>Jakarta Commons Net</title>
  <author email="commons-dev@jakarta.apache.org">Commons Documentation Team</author>
 </properties>

 <body>
 
   <section name="Jakarta Commons Net">
   <p>
     Jakarta Commons Net implements the client side of many basic
     Internet protocols.  The purpose of the library is to provide
     fundamental protocol access, not higher-level
     abstractions. Therefore, some of the design violates
     object-oriented design principles. Our philosophy is to make the
     global functionality of a protocol accessible (e.g., TFTP send
     file and receive file) when possible, but also provide access to
     the fundamental protocols where applicable so that the programmer
     may construct his own custom implementations (e.g, the TFTP
     packet classes and the TFTP packet send and receive methods are
     exposed).
   </p>
   </section>
   <section name="Features">
   <p>
     Supported protocols are:
     <ul>
       <li>FTP</li>
       <li>NNTP</li>
       <li>SMTP</li>
       <li>POP3</li>
       <li>Telnet</li>
       <li>TFTP</li>
       <li>Finger</li>
       <li>Whois</li> 
       <li>rexec/rcmd/rlogin</li>
       <li>Time (rdate) and Daytime</li>
       <li>Echo</li>
       <li>Discard</li>
       <li>NTP/SNTP</li>
     </ul>
   </p>
   </section>
   <section name="Background">
   <p>
    Jakarta Commons Net started as a commercial Java library called
    NetComponents, originally developed by ORO, Inc. in the early
    days of Java.  After its 1.3.8 release in 1998, the source code was
    donated to the Apache Software Foundation and made available under
    the Apache License.  Since then, many programmers have contributed
    to the continued development of Jakarta Commons Net.  The current
    version numbering scheme bears no relation to the old.  In other
    words, Jakarta Commons Net 1.0 succeeded and supplanted
    NetComponents 1.3.8.
   </p>
   </section>
   <section name="Further Information">
	   <p>
		   For more info, see the JavaDoc, or look at some of the following articles:
		   <ul>
			   <li><a href="http://www.informit.com/guides/content.asp?g=java&amp;seqNum=40">http://www.informit.com/guides/content.asp?g=java&amp;seqNum=40</a></li>
				   <li><a href="http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3">http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3</a></li>
				   </ul>
				   </p>
   </section>
</body>
</document>

