KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lateralnz > messaging > util > PacketUtils


1 package org.lateralnz.messaging.util;
2
3 import java.io.Serializable JavaDoc;
4 import java.net.DatagramPacket JavaDoc;
5 import java.net.InetAddress JavaDoc;
6 import java.util.HashMap JavaDoc;
7 import java.util.Map JavaDoc;
8 import java.util.Iterator JavaDoc;
9
10 import org.apache.log4j.Logger;
11
12 import org.lateralnz.common.wrapper.IntHolder;
13 import org.lateralnz.common.util.Constants;
14 import org.lateralnz.common.util.NumericUtils;
15 import org.lateralnz.common.util.ObjectUtils;
16
17 public class PacketUtils implements Constants {
18   private static final Logger log = Logger.getLogger(PacketUtils.class.getName());
19   private static final int THIRTY_MINUTES = 1800000;
20   private static final int TEN_MINUTES = 600000;
21   private static IntHolder MSG_ID = new IntHolder(0); // ids for sent packets
22
private static HashMap JavaDoc receivedPackets = new HashMap JavaDoc(); // a map of received packets
23

24   private static long time = System.currentTimeMillis();
25   
26   private PacketUtils() {
27   }
28   
29   public static final void dumpOldData() {
30     long time2 = System.currentTimeMillis() - time;
31     // after 30 minutes, check the packets map, and remove old packets
32
if (time2 > THIRTY_MINUTES) {
33       if (log.isInfoEnabled()) {
34         log.info("packet dump processing");
35       }
36       // reset timer
37
time = System.currentTimeMillis();
38       Iterator JavaDoc iter = ((HashMap JavaDoc)receivedPackets.clone()).keySet().iterator();
39       PacketDataWrapper dw;
40       while (iter.hasNext()) {
41         String JavaDoc tmpkey = (String JavaDoc)iter.next();
42         dw = (PacketDataWrapper)receivedPackets.get(tmpkey);
43         // remove packets older than 10 minutes
44
if ((System.currentTimeMillis() - dw.getTimeCreated()) > TEN_MINUTES) {
45           if (log.isInfoEnabled()) {
46             log.info("dumping packet " + tmpkey);
47           }
48           iter.remove();
49         }
50       }
51     }
52   }
53   
54   public static final byte[] getPacketID() {
55     int id;
56     synchronized (MSG_ID) {
57       if (MSG_ID.value >= Integer.MAX_VALUE) {
58         MSG_ID.value = 0;
59       }
60       MSG_ID.value++;
61       id = MSG_ID.value;
62     }
63     return NumericUtils.toByteArray(id, false);
64   }
65   
66   public static Object JavaDoc reconstitute(DatagramPacket JavaDoc packet, int receiveBufSize) throws Exception JavaDoc {
67     String JavaDoc addr = packet.getAddress().getHostAddress();
68     int id = NumericUtils.toInt(packet.getData(), 0, 4);
69     int max = NumericUtils.toInt(packet.getData(), 4, 4);
70     int ord = NumericUtils.toInt(packet.getData(), 8, 4);
71
72     String JavaDoc key = addr + UNDERSCORE + id;
73     // work out if we've already received other packets with the same id
74
// from that host
75
PacketDataWrapper dw;
76     if (receivedPackets.containsKey(key)) {
77       dw = (PacketDataWrapper)receivedPackets.get(key);
78     }
79     else {
80       dw = new PacketDataWrapper(max);
81       receivedPackets.put(key, dw);
82     }
83     byte[] tmp = new byte[packet.getData().length - 12];
84     System.arraycopy(packet.getData(), 12, tmp, 0, tmp.length);
85     dw.set(ord, tmp);
86
87     // if we've received all the packets for this event
88
// we'll rebuild the object
89
if (dw.count >= max) {
90       receivedPackets.remove(key);
91
92       return ObjectUtils.deserialize(dw.get());
93     }
94     else {
95       return null;
96     }
97   }
98     
99   public static final DatagramPacket JavaDoc[] split(Serializable JavaDoc obj, InetAddress JavaDoc addr, int port, int maximumBufferSize) throws Exception JavaDoc {
100     byte[] data = ObjectUtils.serialize(obj);
101     // create an ID for the packet
102
byte[] bid = getPacketID();
103     
104
105     // calculate the number of packets required to send this data
106
int packNum = (int)Math.ceil((float)data.length / (float)maximumBufferSize);
107     byte[] pnum = NumericUtils.toByteArray(packNum, false);
108
109     int size = (data.length / maximumBufferSize) + (data.length % maximumBufferSize > 0 ? 1 : 0);
110     DatagramPacket JavaDoc[] packets = new DatagramPacket JavaDoc[size];
111     // loop through the data
112
for (int k = 0, j = 0; j < data.length; j+= maximumBufferSize, k++) {
113       byte[] sendbuf = new byte[maximumBufferSize + 12];
114       System.arraycopy(bid, 0, sendbuf, 0, 4);
115       System.arraycopy(pnum, 0, sendbuf, 4, 4);
116       
117       int len = maximumBufferSize;
118       if (data.length - j < maximumBufferSize) {
119         len = data.length - j;
120       }
121       // copy in a chunk of the data
122
System.arraycopy(data, j, sendbuf, 12, len);
123
124       // set the order (sequence) of this packet
125
System.arraycopy(NumericUtils.toByteArray(k, false), 0, sendbuf, 8, 4);
126
127       // create the datagram packet
128
if (addr == null) {
129         packets[k] = new DatagramPacket JavaDoc(sendbuf, len+12);
130       }
131       else {
132         packets[k] = new DatagramPacket JavaDoc(sendbuf, len+12, addr, port);
133       }
134     }
135
136     return packets;
137   }
138   
139 }
140
Popular Tags