1 package org.sapia.ubik.mcast.server; 2 3 import java.io.EOFException ; 4 import java.io.IOException ; 5 import java.io.InterruptedIOException ; 6 7 import java.net.DatagramPacket ; 8 import java.net.DatagramSocket ; 9 import java.net.SocketException ; 10 11 12 20 public abstract class UDPServer extends Thread { 21 static final int DEFAULT_BUFSZ = 1000; 22 protected DatagramSocket _sock; 23 private int _bufsize = DEFAULT_BUFSZ; 24 25 28 public UDPServer(String name, int soTimeout) throws java.net.SocketException { 29 super(name); 30 super.setDaemon(true); 31 _sock = new DatagramSocket (); 32 _sock.setSoTimeout(soTimeout); 33 } 34 35 public UDPServer(String name, int soTimeout, int port) 36 throws java.net.SocketException { 37 super(name); 38 _sock = new DatagramSocket (port); 39 _sock.setSoTimeout(soTimeout); 40 } 41 42 public void setBufsize(int size) { 43 _bufsize = size; 44 } 45 46 public int getPort() { 47 return _sock.getLocalPort(); 48 } 49 50 public void run() { 51 DatagramPacket pack = null; 52 53 while (true) { 54 try { 55 pack = new DatagramPacket (new byte[_bufsize], _bufsize); 56 _sock.receive(pack); 57 handle(pack, _sock); 58 } catch (InterruptedIOException e) { 59 handleSoTimeout(); 60 } catch (SocketException e) { 61 if (_sock.isClosed()) { 62 break; 63 } 64 } catch (EOFException e) { 65 handlePacketSizeToShort(pack); 66 } catch (IOException e) { 67 e.printStackTrace(); 68 } 69 } 70 } 71 72 protected int bufSize() { 73 return _bufsize; 74 } 75 76 protected abstract void handleSoTimeout(); 77 78 protected abstract void handlePacketSizeToShort(DatagramPacket pack); 79 80 protected abstract void handle(DatagramPacket pack, DatagramSocket sock); 81 } 82 | Popular Tags |