Subversion Repositories programming

Rev

Rev 218 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
214 ira 1
/*******************************************************************************
2
 * File: P2_Packet.java
3
 * Author: Ira W. Snyder (devel@irasnyder.com)
219 ira 4
 * License: GNU General Public License v2
214 ira 5
 * Class: CS380 - Computer Networking
6
 *
7
 * Assignment: Project #2
8
 * Date Last Modified: 2006-02-06
9
 *
10
 * Purpose: Create and Decode packets for the P2_Server and P2_Client.
11
 * ****************************************************************************/
12
 
13
class P2_Packet
14
{
15
    private static final byte packetBegin = (byte)0xaa; // 0b10101010
16
    private static final byte packetEnd   = (byte)0x55; // 0b01010101
17
    private byte packetType;
18
    private byte packetNumber;
19
    private byte packetDataSize;
20
    private byte[] packetData;
21
    private static byte lastPacketNum = -1;
22
 
215 ira 23
    // Fake an enum
24
    public static final byte DROP = 0;
25
    public static final byte TRANSREQ = 1;
26
    public static final byte TRANSREPL = 2;
27
    public static final byte QUIT = 3;
28
    public static final byte BADPACKET = 4;
29
 
214 ira 30
    /**
31
     * Packet Format:
32
     * 1 byte: packetBegin
33
     * 1 byte: packetType
34
     * 1 byte: packetNumber
35
     * 1 byte: packetDataSize
36
     * packetDataSize bytes: data
37
     * 1 byte: packetEnd
38
     */
39
 
40
    /**
41
     * Method: P2_Packet constructor
42
     * Purpose: Construct a P2_Packet given the type and data
43
     */
44
    public P2_Packet (byte type, byte[] data)
45
    {
46
        byte[] p = P2_Packet.createPacket(type, data);
47
        P2_Packet pp = new P2_Packet (p);
48
 
49
        packetType = pp.packetType;
50
        packetNumber = pp.packetNumber;
51
        packetDataSize = pp.packetDataSize;
52
        packetData = pp.packetData;
53
    }
54
 
55
    /**
56
     * Method: P2_Packet constructor
57
     * Purpose: Construct a P2_Packet from a byte[].
58
     * Note: Checks to make sure the byte[] is a valid packet.
59
     */
60
    public P2_Packet (byte[] bytes)
61
    {
62
        int i;
63
 
64
        if (bytes.length < 5)
65
            throw new IllegalArgumentException(); // Definitely a bad packet
66
 
67
        if (bytes[0] != packetBegin)
68
            throw new IllegalArgumentException(); // Definitely a bad packet
69
 
70
        packetType     = bytes[1];
71
        packetNumber   = bytes[2];
72
        packetDataSize = bytes[3];
73
        packetData = new byte[packetDataSize];
74
 
75
        for (i=0; i<packetDataSize; i++)
76
            packetData[i] = bytes[i+4];
77
 
78
        if (bytes[i+4] != packetEnd)
79
            throw new IllegalArgumentException(); // Definitely a bad packet
80
    }
81
 
82
    /**
83
     * Method: createPacket()
84
     * Purpose: Create a packet suitable for transmission over the network,
85
     * using the current values of this class.
86
     */
87
    public byte[] createPacket ()
88
    {
89
        return P2_Packet.createPacket (packetType, packetData);
90
    }
91
 
92
    /**
93
     * Method: createPacket()
94
     * Purpose: Create a packet suitable for sending over the network,
95
     * using the parameters passed in.
218 ira 96
     * NOTE: Automatically sets the packetNumber.
214 ira 97
     */
98
    public static byte[] createPacket (byte type, byte[] data)
99
    {
100
        int i;
101
        byte[] packet = new byte[data.length+5];
102
 
103
        packet[0] = packetBegin;
104
        packet[1] = type;
105
        packet[2] = ++lastPacketNum;
106
        packet[3] = (byte)data.length;
107
 
108
        for (i=0; i<data.length; i++)
109
            packet[i+4] = data[i];
110
 
111
        packet[i+4] = packetEnd;
112
 
113
        return packet;
114
    }
115
 
218 ira 116
    /**
117
     * Method: createPacket()
118
     * Purpose: Create a packet suitable for transmission over the network,
119
     * using the parameters passed in.
120
     */
216 ira 121
    public static byte[] createPacket (byte type, byte[] data, int packetNum)
122
    {
123
        int i;
124
        byte[] packet = new byte[data.length+5];
125
 
126
        packet[0] = packetBegin;
127
        packet[1] = type;
128
        packet[2] = (byte)packetNum;
129
        packet[3] = (byte)data.length;
130
 
131
        for (i=0; i<data.length; i++)
132
            packet[i+4] = data[i];
133
 
134
        packet[i+4] = packetEnd;
135
 
136
        return packet;
137
    }
138
 
214 ira 139
    /**
140
     * Method: toString()
141
     * Purpose: Convert a P2_Packet into a string for printing by a
142
     * PrintStream object.
143
     */
144
    public String toString ()
145
    {
146
        int i;
147
        String s;
148
 
149
        s = new String (    "packetBegin: " + packetBegin + "\n");
150
        s = new String (s + "packetType: " + packetType + "\n");
151
        s = new String (s + "packetNumber: " + packetNumber + "\n");
152
        s = new String (s + "packetDataSize: " + packetDataSize + "\n");
153
        s = new String (s + "packetData: ");
154
 
155
        for (i=0; i<packetDataSize; i++)
156
            s = new String (s + packetData[i]+ " ");
157
 
158
        s = new String (s + "\n");
159
        s = new String (s + "packetEnd: " + packetEnd);
160
 
161
        return s;
162
    }
163
 
164
    /**
218 ira 165
     * Method: getPacketType()
166
     * Purpose: Getter method. Allow access to a private field.
214 ira 167
     */
168
    public byte getPacketType () { return packetType; }
218 ira 169
 
170
    /**
171
     * Method: getPacketNumber()
172
     * Purpose: Getter method. Allow access to a private field.
173
     */
214 ira 174
    public byte getPacketNumber () { return packetNumber; }
218 ira 175
 
176
    /**
177
     * Method: getPacketDataSize()
178
     * Purpose: Getter method. Allow access to a private field.
179
     */
214 ira 180
    public byte getPacketDataSize () { return packetDataSize; }
218 ira 181
 
182
    /**
183
     * Method: getPacketData()
184
     * Purpose: Getter method. Allow access to a private field.
185
     */
214 ira 186
    public byte[] getPacketData () { return packetData; }
187
}
188