KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > ristretto > testserver > TestServer


1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is Ristretto Mail API.
15  *
16  * The Initial Developers of the Original Code are
17  * Timo Stich and Frederik Dietz.
18  * Portions created by the Initial Developers are Copyright (C) 2004
19  * All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */

36 package org.columba.ristretto.testserver;
37
38 import java.io.IOException JavaDoc;
39 import java.io.InputStream JavaDoc;
40 import java.io.OutputStream JavaDoc;
41 import java.net.ServerSocket JavaDoc;
42 import java.net.Socket JavaDoc;
43
44 public class TestServer implements Runnable JavaDoc {
45
46     protected ServerSocket JavaDoc serverSocket;
47     protected Thread JavaDoc thread;
48     protected StringBuffer JavaDoc lineBuffer;
49     protected TestServerSession session;
50     
51     protected boolean closeNow;
52
53     public TestServer(int port, TestServerSession session) throws IOException JavaDoc {
54         serverSocket = new ServerSocket JavaDoc(port);
55         closeNow = false;
56
57         this.session = session;
58
59         lineBuffer = new StringBuffer JavaDoc();
60         
61         thread = new Thread JavaDoc(this);
62         thread.setDaemon(false);
63         thread.start();
64         
65     }
66
67     public synchronized void stop() {
68         try {
69             if (serverSocket != null)
70                 serverSocket.close();
71         } catch (Exception JavaDoc ex) {
72             ex.printStackTrace();
73         }
74     }
75
76     public void run() {
77             try {
78                 // does a client trying to connect to server ?
79
Socket JavaDoc client = serverSocket.accept();
80                 if (client == null)
81                     return;
82
83                 // only accept client from local machine
84
String JavaDoc host = client.getLocalAddress().getHostAddress();
85                 if (!(host.equals("127.0.0.1"))) {
86                     // client isn't from local machine
87
client.close();
88                 }
89
90                 // respond with Hello Response
91
send(client.getOutputStream(), session.serverHelloResponse());
92
93                 while( !session.closeConnection() && !closeNow ) {
94                     // read command
95
String JavaDoc clientCommand = readLine(client.getInputStream());
96                 
97                     String JavaDoc response = session.next(clientCommand);
98                     if( response == null ) {
99                         stop();
100                         throw new Exception JavaDoc("No response for " + clientCommand + "-" );
101                     }
102                     send(client.getOutputStream(), response);
103                 }
104                 
105                 client.close();
106
107             } catch (Exception JavaDoc ex) {
108                 ex.printStackTrace();
109                 stop();
110             }
111     }
112
113     private String JavaDoc readLine(InputStream JavaDoc in) throws IOException JavaDoc {
114         // Clear the buffer
115
lineBuffer.delete(0, lineBuffer.length());
116
117         int read = in.read();
118         // read until CRLF
119
while (read != '\r' && read != -1) {
120             lineBuffer.append((char) read);
121             read = in.read();
122         }
123         lineBuffer.append((char) read);
124         
125         // read the LF
126
read = in.read();
127         lineBuffer.append((char) read);
128
129         return lineBuffer.toString();
130     }
131
132     private void send(OutputStream JavaDoc out, String JavaDoc response) throws IOException JavaDoc {
133         if( response == null || response.length() == 0) return;
134         
135         if( response.charAt(response.length()-1) == '\0') {
136             response = response.substring(0,response.length()-1);
137             closeNow = true;
138         }
139         out.write(response.getBytes());
140         out.flush();
141     }
142 }
143
Popular Tags