home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / httpd / chatroom.java < prev    next >
Text File  |  1995-08-11  |  4KB  |  175 lines

  1. /*
  2.  * @(#)ChatRoom.java    1.1 95/04/03
  3.  *
  4.  * Copyright (c) 1995 Sun Microsystems, Inc.  All Rights reserved
  5.  * Permission to use, copy, modify, and distribute this software
  6.  * and its documentation for NON-COMMERCIAL purposes and without
  7.  * fee is hereby granted provided that this copyright notice
  8.  * appears in all copies. Please refer to the file copyright.html
  9.  * for further important copyright and licensing information.
  10.  *
  11.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  12.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  13.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  14.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  15.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  16.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  17.  */
  18.  
  19. package net.www.httpd;
  20.  
  21. import java.io.*;
  22. import java.util.*;
  23. import net.NetworkServer;
  24.  
  25. /**
  26.  * A class to implement a room in which people can chat.
  27.  * @author  James Gosling
  28.  */
  29.  
  30.  
  31. class ChatRoom {
  32.     static final int histlen = 20;
  33.     String history[] = new String[histlen];
  34.     int histpos = 0;
  35.     String name;
  36.     PrintStream clients[] = new PrintStream[1];
  37.     String clnames[] = new String[1];
  38.  
  39.     private ChatRoom (String n) {
  40.     name = n;
  41.     }
  42.  
  43.     static Hashtable ht = new Hashtable(20);
  44.     static ChatRoom New(String n) {
  45.     Object o = ht.get(n);
  46.     if (o != null)
  47.         return (ChatRoom) o;
  48.     ChatRoom ret = new ChatRoom (n);
  49.     ht.put(n, ret);
  50.     return ret;
  51.     }
  52.  
  53.     synchronized void addListener(PrintStream p, String clname) {
  54.     int i;
  55.     for (i = clients.length; --i >= 0 && clients[i] != null;);
  56.     addString(clname + " has just entered the room.\n");
  57.     if (i >= 0) {
  58.         clients[i] = p;
  59.         clnames[i] = clname;
  60.     } else {
  61.         PrintStream nc[] = new PrintStream[clients.length * 2];
  62.         System.arraycopy(clients, 0, nc, 0, clients.length);
  63.         String nn[] = new String[nc.length];
  64.         System.arraycopy(clnames, 0, nn, 0, clnames.length);
  65.         nc[clients.length] = p;
  66.         nn[clients.length] = clname;
  67.         clients = nc;
  68.         clnames = nn;
  69.     }
  70.     p.print("Welcome to " + name + "\n");
  71.     int nseen = 0;
  72.     String lastName = null;
  73.     for (i = clients.length; --i >= 0;)
  74.         if (clients[i] != null && clients[i] != p) {
  75.         String n = clnames[i];
  76.         if (lastName != null) {
  77.             if (nseen > 1)
  78.             p.print(", ");
  79.             p.print(lastName);
  80.         }
  81.         lastName = n;
  82.         nseen++;
  83.         }
  84.     if (lastName != null) {
  85.         if (nseen > 1)
  86.         p.print(" and ");
  87.         p.print(lastName);
  88.         p.print(nseen > 1 ? " are " : " is ");
  89.         p.print("already in the room.\n");
  90.     } else
  91.         p.print("You are alone in the room.\n");
  92.     for (i = history.length; --i >= 0;) {
  93.         int slot = histpos - i;
  94.         if (slot < 0)
  95.         slot += history.length;
  96.         if (history[slot] != null) {
  97.         p.print(history[slot]);
  98.         p.print("\n");
  99.         }
  100.     }
  101.     p.flush();
  102.     }
  103.  
  104.     synchronized void removeListener(PrintStream p) {
  105.     int i;
  106.     int nlisteners = 0;
  107.     for (i = clients.length; --i >= 0;)
  108.         if (clients[i] == p) {
  109.         try {
  110.             clients[i].close();
  111.         } catch(Exception e);
  112.         clients[i] = null;
  113.         addString(clnames[i] + " has left the room.\n");
  114.         } else if (clients[i] != null)
  115.         nlisteners++;
  116.     if (nlisteners == 0) {
  117.         ht.remove(name);
  118.     }
  119.     }
  120.  
  121.     synchronized void addString(String s) {
  122.     history[histpos] = s;
  123.     histpos++;
  124.     if (histpos > clients.length)
  125.         histpos = 0;
  126.     for (int i = clients.length; --i >= 0;)
  127.         try {
  128.         if (clients[i] != null) {
  129.         try {
  130.             clients[i].print(s);
  131.             clients[i].print("\n");
  132.             clients[i].flush();
  133.         } catch(Exception e) {
  134.             removeListener(clients[i]);
  135.         }
  136.         }
  137.         } catch(Exception e) {
  138.         }
  139.  
  140.     }
  141.  
  142.     void converse(NetworkServer ns) {
  143.     InputStream in = ns.clientInput;
  144.     String clientName = null;
  145.     char line[] = new char[1];
  146.     try {
  147.         while (true) {
  148.         int c;
  149.         int dp = 0;
  150.         while ((c = in.read()) != -1 && c != '\n' && c != '\r') {
  151.             if (dp >= line.length) {
  152.             char nc[] = new char[line.length * 2];
  153.             System.arraycopy(line, 0, nc, 0, line.length);
  154.             line = nc;
  155.             }
  156.             line[dp++] = (char) c;
  157.         }
  158.         if (c < 0)
  159.             break;
  160.         if (dp <= 0)
  161.             continue;
  162.         String s = String.copyValueOf(line, 0, dp);
  163.         if (clientName == null) {
  164.             clientName = s;
  165.             addListener(ns.clientOutput, clientName);
  166.         } else {
  167.             addString(clientName + ": " + s);
  168.         }
  169.         }
  170.     } catch(Exception e) {
  171.     }
  172.     removeListener(ns.clientOutput);
  173.     }
  174. }
  175.