001 
002 /**
003  * Title:        Advanced Network Client Sample<p>
004  * Description:  <p>
005  * Copyright:    Copyright (C) 2009 Alexey Veremenko<p>
006  * Company:      <p>
007  @author Alexey Veremenko
008  @version 1.0
009  */
010 package networking.server;
011 
012 import networking.protocol.*;
013 
014 import java.net.*;
015 import java.util.*;
016 
017 /**
018  * TalkServer - this class represents a server which provides an opportinity
019  * to exchange messages
020  */
021 class TalkServer extends Server
022 {
023     /**
024      * Master server
025      */
026     protected MasterServerEx m_master = null;
027 
028     /**
029      * Registered flag
030      */
031     private boolean m_reg = false;
032 
033     /**
034      * Construct new TalkServer object from parent server
035      @param s parent server
036      */
037     public TalkServer(Server s)
038     {
039         super(s);
040         m_master = (MasterServerEx)s.m_master;
041         //setTimeOut(1000 * 10);
042     }
043 
044     /**
045      * Translate message type for sending it to clients
046      @param msg message
047      */
048     protected int translateMessageType(Message msg)
049     {
050         switch (msg.getType())
051         {
052             case Message.MESSAGE_SENT:
053                  return Message.NEW_MESSAGE;
054             case Message.DEBAR_SENT:
055                  return Message.DEBAR;
056         }
057 
058         throw new IllegalArgumentException("Incorrect message type");
059     }
060 
061     /*
062      * Override Server
063      */
064     protected void processMessage(Message msgthrows Exception
065     {
066         switch (msg.getType())
067         {
068             /* Client messages */
069             case Message.MESSAGE_SENT:
070             case Message.DEBAR_SENT:
071             {
072                 // Circulate message to a recipient audience
073                 circulateMessage(msg);
074                 break;
075             }
076             case Message.BROADCAST_SENT:
077             {
078                 synchronized (m_master)
079                 {
080                     // Circulate message to all clients
081                     for (Iterator i = m_master.getServers().iterator(); i.hasNext())
082                     {
083                         Server s = (Server)i.next();
084                         s.enque(new Message(Message.NEW_MESSAGE, getClient(),
085                                     msg.getText()));
086                     }
087                 }
088                 break;
089             }
090             case Message.ACCEPT_FILE_SENT:
091             {
092                 synchronized (m_master)
093                 {
094                     FileUploadServer s = m_master.getFileServer(msg.getCode());
095                     if (s != null)
096                        s.acceptFile();
097                 }
098                 break;
099             }
100             case Message.REJECT_FILE_SENT:
101             {
102                 synchronized (m_master)
103                 {
104                     FileUploadServer s = m_master.getFileServer(msg.getCode());
105                     if (s != null)
106                        s.rejectFile();
107                 }
108                 break;
109             }
110 
111             /* Master messages */
112             case Message.CLIENT_LIST_CHANGED:
113             case Message.NEW_MESSAGE:
114             case Message.NEW_FILE:
115             case Message.DEBAR:
116             case Message.ACCEPT:
117             {
118                 // Route message to client
119                 send(msg);
120                 break;
121             }
122             case Message.REJECT:
123             {
124                 // Route message to client
125                 send(msg);
126                 // Indicate exit
127                 send(new Message(Message.BYE));
128                 exit();
129                 break;
130             }
131 
132             /* Route other messages to parent */
133             default:
134             {
135                 super.processMessage(msg);
136                 break;
137             }
138         }
139     }
140 
141     /*
142      * Override Server
143      */
144     protected void run1() throws Exception
145     {
146         // Register
147         m_reg = m_master.register(this);
148         if (m_reg)
149            log("Register");
150         super.run1();
151     }
152 
153     /*
154      * Override Server
155      */
156     public void run()
157     {
158         super.run();
159 
160         try
161         {
162             // Unregister
163             if (m_reg)
164             {
165                 m_master.unregister(this);
166                 log("Unregister");
167             }
168         }
169         catch (Exception ex)
170         {
171             // Can't do anything here
172         }
173     }
174 }
Java2html