Subversion Repositories programming

Rev

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