8 import java.nio.ByteBuffer;
11 /** Class IoTSocket is the basic class for IoT RMI
12 * socket communication. This class will be extended
13 * by both IoTSocketServer and IoTSocketClient
15 * Adapted from Java/C++ socket implementation
17 * @see <a href="https://www.keithv.com/software/socket/</a>
19 * @author Rahmadi Trimananda <rtrimana @ uci.edu>
23 public abstract class IoTSocket {
28 protected byte data[];
30 protected Socket sock;
31 protected BufferedInputStream input;
32 protected BufferedOutputStream output;
37 protected static int BUFFSIZE = 128000; // how many bytes our incoming buffer can hold (original)
38 //protected static int BUFFSIZE = 8388608; // 8388608 = 2^23 bytes of memory (8MB) - this is required by our IHome speaker driver
39 protected static int MSG_LEN_SIZE = 4; // send length in the size of integer (4 bytes)
44 protected IoTSocket(int _port) throws IOException
47 data = new byte[BUFFSIZE];
52 * sendBytes() sends an array of bytes
54 public synchronized void sendBytes(byte vals[]) throws IOException
56 int len = vals.length;
57 // Write the length first - convert to array of 4 bytes
58 ByteBuffer bb = ByteBuffer.allocate(MSG_LEN_SIZE);
60 output.write(bb.array(), 0, MSG_LEN_SIZE);
62 // Write the byte array
63 output.write(vals, 0, len);
71 * receiveBytes() receives an array of bytes
73 public synchronized byte[] receiveBytes(byte val[]) throws IOException
79 // Wait until input is available
80 while(input.available() == 0);
81 // Read the maxlen first - read 4 bytes here
82 byte[] lenBytes = new byte[MSG_LEN_SIZE];
83 input.read(lenBytes, 0, MSG_LEN_SIZE);
84 int maxlen = ByteBuffer.wrap(lenBytes).getInt();
85 // Receive until maxlen
86 if (maxlen>BUFFSIZE) {
87 System.out.println("IoTSocketClient/Server: Sending more bytes then will fit in buffer! Number of bytes: " + maxlen);
88 // Allocate a bigger array when needed
90 while (newLen < maxlen) // Shift until we get a new buffer size that's bigger than maxLen (basically power of 2)
92 System.out.println("IoTSocketClient/Server: Allocating a bigger buffer now with size: " + newLen);
93 data = new byte[newLen];
95 val = new byte[maxlen];
96 while (totalbytes < maxlen)
98 numbytes = input.read(data);
99 // copy the bytes into the result buffer
100 for (i=totalbytes; i<totalbytes+numbytes; i++)
101 val[i] = data[i-totalbytes];
102 totalbytes += numbytes;
104 // we now send an acknowledgement to the server to let them
114 * Close socket connection
116 public synchronized void close() throws IOException
125 public synchronized void sendAck() throws IOException
137 public synchronized void receiveAck() throws IOException
140 ack = (int) input.read();