1 29 38 39 package org.planetamessenger.net; 40 41 import java.net.*; 42 import java.util.*; 43 import java.io.IOException ; 44 45 46 47 public class JThreadServerSocket implements Runnable { 48 49 static final int INTERVAL = 100; 50 static final int ACCEPT_TIMEOUT = 2000; 51 52 ServerSocket serverSok; 53 Thread serverThread; 54 ArrayList<JSocketEventListener> evtListener; 55 boolean bListening; 56 57 58 59 67 public JThreadServerSocket( int nInitialPort, int nEndPort ) throws java.io.IOException { 68 69 boolean bSocketOk = true; 70 java.io.IOException e; 71 72 73 74 bListening = false; 75 evtListener = new ArrayList<JSocketEventListener>(); 76 77 for( int nPort = nInitialPort; nPort <= nEndPort; nPort++ ) { 78 try { 79 serverSok = new java.net.ServerSocket ( nPort ); 80 bSocketOk = true; 81 break; 82 } catch( IOException ex ) { 83 bSocketOk = false; 84 } 85 } 86 87 if( !bSocketOk ) { 88 e = new java.io.IOException ( "org.planetamessenger.net exception - Cannot open a JThreadServerSocket" ); 89 throw e; 90 } 91 else 92 try { 93 serverSok.setSoTimeout( ACCEPT_TIMEOUT ); 94 serverThread = new java.lang.Thread ( this ); 95 } catch( java.net.SocketException ex ) { 96 e = new java.io.IOException ( "org.planetamessenger.net exception - Cannot open a JThreadServerSocket" ); 97 throw e; 98 } 99 } 100 101 105 private synchronized void notifyMainThread() { 106 107 try { 108 System.err.println( "JThreadServerSocket.notifyMainThread() - Normal Thread exit." ); 109 notifyAll(); 110 } catch( java.lang.IllegalMonitorStateException me ) { 111 System.err.println( "JThreadServerSocket.notifyMainThread() - " + me ); 112 } 113 } 114 115 120 private void fireOnAccept( Socket clientSok ) { 121 122 ArrayList<JSocketEventListener> clone; 123 124 synchronized( this ) { 125 clone = ( ArrayList<JSocketEventListener> ) evtListener.clone(); 126 } 127 128 if( clone.size() > 0 ) { 130 for( int nCount = 0; nCount < clone.size(); nCount++ ) 131 ( ( JSocketEventListener ) evtListener ).onAccept( clientSok ); 132 } 133 } 134 135 141 public synchronized boolean listen( boolean bStart ) { 142 143 if( bStart ) { 144 if( !serverThread.isAlive() ) { 145 bListening = true; 146 serverThread.start(); 147 } 148 } 149 else { 150 151 157 158 if( bListening ) { 159 serverThread.interrupt(); 160 bListening = false; 161 162 try { 163 close(); 164 wait(); 165 System.err.println( "JThreadServerSocket.listen( false ) performed" ); 166 } catch( java.lang.InterruptedException ie ) { 167 System.err.println( "JThreadServerSocket.listen( false ) - " + ie ); 168 } catch( java.lang.IllegalMonitorStateException me ) { 169 System.err.println( "JThreadServerSocket.listen( false ) - " + me ); 170 } 171 } 172 } 173 174 return true; 175 } 176 177 180 public void close() { 181 182 try { 183 serverSok.close(); 184 } catch( java.io.IOException e ) { 185 System.err.println( "JThreadServerSocket.close() - " + e ); 186 } 187 } 188 189 199 public synchronized void addSocketEventListener( org.planetamessenger.net.JSocketEventListener evt ) { 200 201 evtListener.add( evt ); 202 } 203 204 205 210 public synchronized void removeSocketEventListener( org.planetamessenger.net.JSocketEventListener evt ) { 211 212 evtListener.remove( evt ); 213 } 214 215 219 public int getLocalPort() { 220 221 return serverSok.getLocalPort(); 222 } 223 224 228 public InetAddress getInetAddress() { 229 230 return serverSok.getInetAddress(); 231 } 232 233 237 public void run() { 238 239 while( true ) { 240 241 try { 242 243 if( !bListening ) 245 break; 246 247 Thread.sleep( INTERVAL ); 248 } catch( InterruptedException e ) { 249 System.err.println( "JThreadServerSocket.run() - " + e ); 250 break; 251 } 252 253 try { 254 java.net.Socket clientSok = serverSok.accept(); 255 256 fireOnAccept( clientSok ); 257 258 } catch( java.io.IOException e ) { 259 } 261 } 262 263 notifyMainThread(); 265 } 266 } 267 268 | Popular Tags |