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 msg) throws 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 }
|