-
Notifications
You must be signed in to change notification settings - Fork 0
/
InputCommand.java
154 lines (130 loc) · 2.76 KB
/
InputCommand.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import java.io.InputStream;
import java.net.Socket;
/**
* @author martin (cernama9@fit.cvut.cz)
* @since 7.3.15.
*/
/**
* Handles the input of commands
*/
final class InputCommand
{
Socket clientSocket;
InputStream stream;
/**
* Constructor
*
* @param stream The input stream to be read from
* @param clientSocket The client's socket (for logging purposes)
*/
InputCommand(InputStream stream, Socket clientSocket)
{
this.clientSocket = clientSocket;
this.stream = stream;
}
/**
* Reads a line (a string of chars ending with \r\n)
*
* @return The line read from the stream
*/
public String readLine()
{
StringBuilder inputBuilder = new StringBuilder();
boolean carriageReturnDetected = false;
boolean reachedEndOfLine = false;
while (!reachedEndOfLine)
{
try
{
int data = stream.read();
if (data == -1) return null;
char c = (char) data;
inputBuilder.append(c);
switch (c)
{
case '\r':
carriageReturnDetected = true;
break;
case '\n':
if (carriageReturnDetected)
{
reachedEndOfLine = true;
carriageReturnDetected = false;
}
break;
default:
carriageReturnDetected = false;
}
}
catch (Exception e)
{
return null;
}
}
final String inputLine = inputBuilder.substring(0, inputBuilder.length() - 2);
printLogMessage(inputLine);
return inputLine;
}
/**
* Reads a specified number of bytes from the stream
*
* @param count The number of bytes to read
* @return The bytes read from the stream
*/
public byte[] readBytes(int count)
{
byte data[] = new byte[count];
try
{
for (int i = 0; i < count; i++)
{
int readData = stream.read();
if (readData == -1) return null;
data[i] = (byte) readData;
}
}
catch (Exception e)
{
return null;
}
return data;
}
/**
* Reads a single character from the stream
*
* @return The character read from the stream
* @throws Exception
*/
public char readChar() throws Exception
{
int readData;
try
{
readData = stream.read();
if (readData == -1) throw new Exception();
}
catch (Exception ignored)
{
throw new Exception("Unable to read single char");
}
return (char) readData;
}
/**
* Prints a log message to the system's stream (for debugging purposes)
*
* @param received The data to be printed out
*/
private void printLogMessage(String received)
{
final String message = "[DEBUG][>][" + clientSocket.getInetAddress() + ":" + clientSocket.getPort() + "] " +
"Received " + received.length() + " bytes";
if (received.length() > 20)
{
System.out.println(message + ". First 20: " + received.substring(0, 19));
}
else
{
System.out.println(message + ": " + received);
}
}
}