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 JThreadServerUDP implements Runnable { 48 49 static final int INTERVAL = 100; 50 static final int RECEIVE_TIMEOUT = 2000; 51 static final int DEF_DATAGRAM_BUFFER_SIZE = 8192; 52 53 DatagramSocket serverUDP; 54 Thread serverThread; 55 ArrayList<JDatagramEventListener> evtListener; 56 int nPacketSize; 57 boolean bListening; 58 59 60 61 69 public JThreadServerUDP( int nInitialPort, int nEndPort ) throws java.io.IOException { 70 71 boolean bSocketOk = true; 72 java.io.IOException e; 73 74 75 bListening = false; 76 evtListener = new ArrayList<JDatagramEventListener>(); 77 nPacketSize = DEF_DATAGRAM_BUFFER_SIZE; 78 79 for( int nPort = nInitialPort; nPort <= nEndPort; nPort++ ) { 80 try { 81 serverUDP = new DatagramSocket( nPort ); 82 bSocketOk = true; 83 break; 84 } catch( IOException ex ) { 85 bSocketOk = false; 86 } 87 } 88 89 if( !bSocketOk ) { 90 e = new java.io.IOException ( "org.planetamessenger.net exception - Cannot open a JThreadServerUDP" ); 91 throw e; 92 } 93 else 94 try { 95 serverUDP.setSoTimeout( RECEIVE_TIMEOUT ); 96 serverThread = new Thread ( this ); 97 } catch( java.net.SocketException ex ) { 98 e = new java.io.IOException ( "org.planetamessenger.net exception - Cannot open a JThreadServerUDP" ); 99 throw e; 100 } 101 } 102 103 107 private synchronized void notifyMainThread() { 108 109 try { 110 System.err.println( "JThreadServerUDP.notifyMainThread() - Normal Thread exit." ); 111 notifyAll(); 112 } catch( java.lang.IllegalMonitorStateException me ) { 113 System.err.println( "JThreadServerUDP.notifyMainThread() - " + me ); 114 } 115 } 116 117 122 private void fireOnReceive( java.net.DatagramPacket clientPak ) { 123 124 ArrayList<JDatagramEventListener> clone; 125 126 synchronized( this ) { 127 clone = ( ArrayList<JDatagramEventListener> ) evtListener.clone(); 128 } 129 130 if( clone.size() > 0 ) { 132 for( int nCount = 0; nCount < clone.size(); nCount++ ) 133 ( ( JDatagramEventListener ) evtListener ).onReceive( clientPak ); 134 } 135 } 136 137 146 public synchronized void addDatagramEventListener( org.planetamessenger.net.JDatagramEventListener evt ) { 147 148 evtListener.add( evt ); 149 } 150 151 156 public synchronized void removeDatagramEventListener( org.planetamessenger.net.JDatagramEventListener evt ) { 157 158 evtListener.remove( evt ); 159 } 160 161 167 public boolean setPacketSize( int nPacketSize ) { 168 169 if( !serverThread.isAlive() ) 170 this.nPacketSize = nPacketSize; 171 else 172 return false; 173 174 return true; 175 } 176 177 181 int getPacketSize() { 182 183 return nPacketSize; 184 } 185 186 192 public synchronized boolean listen( boolean bStart ) { 193 194 if( bStart ) { 195 if( !serverThread.isAlive() ) { 196 bListening = true; 197 serverThread.start(); 198 } 199 } 200 else { 201 202 if( bListening ) { 203 serverThread.interrupt(); 204 bListening = false; 205 206 try { 207 close(); 208 wait(); 209 System.err.println( "JThreadServerUDP.listen( false ) performed" ); 210 } catch( java.lang.InterruptedException ie ) { 211 System.err.println( "JThreadServerUDP.listen( false ) - " + ie ); 212 } catch( java.lang.IllegalMonitorStateException me ) { 213 System.err.println( "JThreadServerUDP.listen( false ) - " + me ); 214 } 215 } 216 } 217 218 return true; 219 } 220 221 224 public void close() { 225 226 serverUDP.close(); 227 } 228 229 233 public int getLocalPort() { 234 235 return serverUDP.getLocalPort(); 236 } 237 238 242 public void run() { 243 244 byte[] packet = new byte[nPacketSize]; 245 246 247 while( true ) { 248 249 try { 250 251 if( !bListening ) 253 break; 254 255 Thread.sleep( INTERVAL ); 256 257 } catch( InterruptedException e ) { 258 System.err.println( "JThreadServerUDP.run() - " + e ); 259 break; 260 } 261 262 try { 263 java.net.DatagramPacket clientPak = new DatagramPacket( packet, packet.length ); 264 265 serverUDP.receive( clientPak ); 266 267 fireOnReceive( clientPak ); 268 269 } catch( java.io.IOException e ) { 270 } 272 } 273 274 notifyMainThread(); 276 } 277 } 278 279 | Popular Tags |