@@ -39,6 +39,10 @@ class SocketChannelReader {
3939
4040 private final ClientPacketWriter writer ;
4141
42+ // We're single-threaded, so we can just reuse a single max-size buffer
43+ // over and over instead of endlessly reallocating it.
44+ private final ByteBuffer readBuffer = ByteBuffer .allocate (DataConst .MAX_RECEIVE_BUFFER_SIZE );
45+
4246 public SocketChannelReader (ClientPacketWriter writer ) {
4347 this .writer = writer ;
4448 }
@@ -89,17 +93,16 @@ private void readTCP(@NonNull Session session) {
8993 }
9094
9195 SocketChannel channel = (SocketChannel ) session .getChannel ();
92- ByteBuffer buffer = ByteBuffer .allocate (DataConst .MAX_RECEIVE_BUFFER_SIZE );
9396 int len ;
9497
9598 try {
9699 do {
97- len = channel .read (buffer );
100+ len = channel .read (readBuffer );
98101 if (len > 0 ) { //-1 mean it reach the end of stream
99- buffer .limit (len );
100- buffer .flip ();
101- sendToRequester (buffer , session );
102- buffer .clear ();
102+ readBuffer .limit (len );
103+ readBuffer .flip ();
104+ sendToRequester (readBuffer , session );
105+ readBuffer .clear ();
103106 } else if (len == -1 ) {
104107 Log .d (TAG ,"End of data from remote server, will send FIN to client" );
105108 Log .d (TAG ,"send FIN to: " + session );
@@ -206,7 +209,6 @@ private void sendFin(Session session){
206209
207210 private void readUDP (Session session ){
208211 DatagramChannel channel = (DatagramChannel ) session .getChannel ();
209- ByteBuffer buffer = ByteBuffer .allocate (DataConst .MAX_RECEIVE_BUFFER_SIZE );
210212 int len ;
211213
212214 try {
@@ -215,23 +217,21 @@ private void readUDP(Session session){
215217 break ;
216218 }
217219
218- len = channel .read (buffer );
220+ len = channel .read (readBuffer );
219221 if (len > 0 ) {
220- buffer .limit (len );
221- buffer .flip ();
222+ readBuffer .limit (len );
223+ readBuffer .flip ();
222224
223225 //create UDP packet
224- byte [] data = new byte [len ];
225- System .arraycopy (buffer .array (),0 , data , 0 , len );
226226 byte [] packetData = UDPPacketFactory .createResponsePacket (
227- session .getLastIpHeader (), session .getLastUdpHeader (), data );
227+ session .getLastIpHeader (), session .getLastUdpHeader (), readBuffer );
228+ readBuffer .clear ();
228229
229230 //write to client
230231 writer .write (packetData );
231232
232233 Log .d (TAG ,"SDR: sent " + len + " bytes to UDP client, packetData.length: "
233234 + packetData .length );
234- buffer .clear ();
235235 }
236236 } while (len > 0 );
237237 }catch (NotYetConnectedException ex ){
0 commit comments