@@ -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