0N/A/*
2362N/A * Copyright (c) 1995, 2000, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/Apackage sun.net;
0N/A
0N/Aimport java.io.*;
0N/Aimport java.net.Socket;
0N/Aimport java.net.ServerSocket;
0N/A
0N/A/**
0N/A * This is the base class for network servers. To define a new type
0N/A * of server define a new subclass of NetworkServer with a serviceRequest
0N/A * method that services one request. Start the server by executing:
0N/A * <pre>
0N/A * new MyServerClass().startServer(port);
0N/A * </pre>
0N/A */
0N/Apublic class NetworkServer implements Runnable, Cloneable {
0N/A /** Socket for communicating with client. */
0N/A public Socket clientSocket = null;
0N/A private Thread serverInstance;
0N/A private ServerSocket serverSocket;
0N/A
0N/A /** Stream for printing to the client. */
0N/A public PrintStream clientOutput;
0N/A
0N/A /** Buffered stream for reading replies from client. */
0N/A public InputStream clientInput;
0N/A
0N/A /** Close an open connection to the client. */
0N/A public void close() throws IOException {
0N/A clientSocket.close();
0N/A clientSocket = null;
0N/A clientInput = null;
0N/A clientOutput = null;
0N/A }
0N/A
0N/A /** Return client connection status */
0N/A public boolean clientIsOpen() {
0N/A return clientSocket != null;
0N/A }
0N/A
0N/A final public void run() {
0N/A if (serverSocket != null) {
0N/A Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
0N/A // System.out.print("Server starts " + serverSocket + "\n");
0N/A while (true) {
0N/A try {
0N/A Socket ns = serverSocket.accept();
0N/A// System.out.print("New connection " + ns + "\n");
0N/A NetworkServer n = (NetworkServer)clone();
0N/A n.serverSocket = null;
0N/A n.clientSocket = ns;
0N/A new Thread(n).start();
0N/A } catch(Exception e) {
0N/A System.out.print("Server failure\n");
0N/A e.printStackTrace();
0N/A try {
0N/A serverSocket.close();
0N/A } catch(IOException e2) {}
0N/A System.out.print("cs="+serverSocket+"\n");
0N/A break;
0N/A }
0N/A }
0N/A// close();
0N/A } else {
0N/A try {
0N/A clientOutput = new PrintStream(
0N/A new BufferedOutputStream(clientSocket.getOutputStream()),
0N/A false, "ISO8859_1");
0N/A clientInput = new BufferedInputStream(clientSocket.getInputStream());
0N/A serviceRequest();
0N/A // System.out.print("Service handler exits
0N/A // "+clientSocket+"\n");
0N/A } catch(Exception e) {
0N/A // System.out.print("Service handler failure\n");
0N/A // e.printStackTrace();
0N/A }
0N/A try {
0N/A close();
0N/A } catch(IOException e2) {}
0N/A }
0N/A }
0N/A
0N/A /** Start a server on port <i>port</i>. It will call serviceRequest()
0N/A for each new connection. */
0N/A final public void startServer(int port) throws IOException {
0N/A serverSocket = new ServerSocket(port, 50);
0N/A serverInstance = new Thread(this);
0N/A serverInstance.start();
0N/A }
0N/A
0N/A /** Service one request. It is invoked with the clientInput and
0N/A clientOutput streams initialized. This method handles one client
0N/A connection. When it is done, it can simply exit. The default
0N/A server just echoes it's input. It is invoked in it's own private
0N/A thread. */
0N/A public void serviceRequest() throws IOException {
0N/A byte buf[] = new byte[300];
0N/A int n;
0N/A clientOutput.print("Echo server " + getClass().getName() + "\n");
0N/A clientOutput.flush();
0N/A while ((n = clientInput.read(buf, 0, buf.length)) >= 0) {
0N/A clientOutput.write(buf, 0, n);
0N/A }
0N/A }
0N/A
0N/A public static void main(String argv[]) {
0N/A try {
0N/A new NetworkServer ().startServer(8888);
0N/A } catch (IOException e) {
0N/A System.out.print("Server failed: "+e+"\n");
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Clone this object;
0N/A */
0N/A public Object clone() {
0N/A try {
0N/A return super.clone();
0N/A } catch (CloneNotSupportedException e) {
0N/A // this shouldn't happen, since we are Cloneable
0N/A throw new InternalError();
0N/A }
0N/A }
0N/A
0N/A public NetworkServer () {
0N/A }
0N/A}