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
38 protected static int MSG_LEN_SIZE = 4; // send length in the size of integer (4 bytes)
43 protected IoTSocket(int _port) throws IOException
46 data = new byte[BUFFSIZE];
51 * sendBytes() sends an array of bytes
53 public synchronized void sendBytes(byte vals[]) throws IOException
55 int len = vals.length;
56 // Write the length first - convert to array of 4 bytes
57 ByteBuffer bb = ByteBuffer.allocate(MSG_LEN_SIZE);
59 output.write(bb.array(), 0, MSG_LEN_SIZE);
61 // Write the byte array
62 output.write(vals, 0, len);
70 * receiveBytes() receives an array of bytes
72 public synchronized byte[] receiveBytes(byte val[]) throws IOException
78 // Wait until input is available
79 while(input.available() == 0);
80 // Read the maxlen first - read 4 bytes here
81 byte[] lenBytes = new byte[MSG_LEN_SIZE];
82 input.read(lenBytes, 0, MSG_LEN_SIZE);
83 int maxlen = ByteBuffer.wrap(lenBytes).getInt();
84 // Receive until maxlen
86 System.out.println("IoTSocketClient/Server: Sending more bytes then will fit in buffer!");
87 val = new byte[maxlen];
88 while (totalbytes < maxlen)
90 numbytes = input.read(data);
91 // copy the bytes into the result buffer
92 for (i=totalbytes; i<totalbytes+numbytes; i++)
93 val[i] = data[i-totalbytes];
94 totalbytes += numbytes;
96 // we now send an acknowledgement to the server to let them
106 * Close socket connection
108 public synchronized void close() throws IOException
117 public synchronized void sendAck() throws IOException
129 public synchronized void receiveAck() throws IOException
132 ack = (int) input.read();