2323import org .jsl .tests .Util ;
2424
2525import java .io .IOException ;
26+ import java .net .InetSocketAddress ;
2627import java .net .SocketAddress ;
2728import java .nio .ByteBuffer ;
2829import java .nio .channels .SocketChannel ;
@@ -42,8 +43,8 @@ public void run()
4243 {
4344 try
4445 {
45- SocketChannel socketChannel = SocketChannel .open ();
46- socketChannel .socket ().setReceiveBufferSize ( m_socketBufferSize );
46+ final SocketChannel socketChannel = SocketChannel .open ();
47+ socketChannel .socket ().setReceiveBufferSize (m_socketBufferSize );
4748
4849 StreamDefragger streamDefragger = new StreamDefragger (4 )
4950 {
@@ -59,49 +60,54 @@ protected int validateHeader( ByteBuffer header )
5960 return ;
6061 }
6162
62- ByteBuffer bb = ByteBuffer .allocateDirect ( m_socketBufferSize );
63-
64- ByteBuffer startRequest = m_startRequest .duplicate ();
65- final int bytesSent = socketChannel .write ( startRequest );
63+ final ByteBuffer startRequest = m_startRequest .duplicate ();
64+ final int bytesSent = socketChannel .write (startRequest );
6665 if (bytesSent != startRequest .capacity ())
6766 {
6867 System .out .println ( "SocketChannel.send() failed." );
6968 return ;
7069 }
7170
71+ final ByteBuffer bb = ByteBuffer .allocateDirect (1024 *128 );
7272 int messages = 0 ;
7373 int bytesReceivedTotal = 0 ;
74- long startTime = 0 ;
75-
76- readSocketLoop : for (;;)
74+ int bytesReceived = socketChannel .read (bb );
75+ if (bytesReceived > 0 )
7776 {
78- final int bytesReceived = socketChannel . read ( bb );
79- if ( bytesReceived > 0 )
77+ final long startTime = System . nanoTime ( );
78+ for (;; )
8079 {
81- if (bytesReceivedTotal == 0 )
82- startTime = System .nanoTime ();
8380 bytesReceivedTotal += bytesReceived ;
8481
85- bb .position ( 0 );
86- bb .limit ( bytesReceived );
87- ByteBuffer msg = streamDefragger .getNext ( bb );
82+ bb .position (0 );
83+ bb .limit (bytesReceived );
84+ ByteBuffer msg = streamDefragger .getNext (bb );
8885 while (msg != null )
8986 {
9087 final int messageLength = msg .getInt ();
91- assert ( messageLength == m_messageLength );
92- if (++messages == m_messages )
93- break readSocketLoop ;
88+ assert (messageLength == m_messageLength );
89+ messages ++;
9490 msg = streamDefragger .getNext ();
9591 }
92+
93+ if (messages == m_messages )
94+ break ;
95+
9696 bb .clear ();
97+ bytesReceived = socketChannel .read (bb );
98+ if (bytesReceived <= 0 )
99+ break ;
97100 }
101+ long entTime = System .nanoTime ();
102+
103+ System .out .println (
104+ "Received " + messages + " messages (" + bytesReceivedTotal +
105+ " bytes) at " + Util .formatDelay (startTime , entTime ));
98106 }
99- long entTime = System . nanoTime ();
100- socketChannel . close ( );
107+ else
108+ System . out . println ( "Socket read error." );
101109
102- System .out .println (
103- "Received " + messages + " messages (" + bytesReceivedTotal +
104- " bytes) at " + Util .formatDelay (startTime , entTime ) + "." );
110+ socketChannel .close ();
105111 }
106112 catch (IOException ex )
107113 {
@@ -110,23 +116,23 @@ protected int validateHeader( ByteBuffer header )
110116 }
111117 }
112118
113- public Client ( int sessions , int messages , int messageLength , int socketBufferSize )
119+ public Client (int sessions , int messages , int messageLength , int socketBufferSize )
114120 {
115121 m_session = new SessionThread [sessions ];
116122 m_messages = messages ;
117123 m_messageLength = messageLength ;
118124 m_socketBufferSize = socketBufferSize ;
119125
120126 /* length + sessions + messages + message length */
121- m_startRequest = ByteBuffer .allocateDirect ( 4 + 4 + 4 + 4 );
122- m_startRequest .putInt ( 16 );
123- m_startRequest .putInt ( sessions );
124- m_startRequest .putInt ( messages );
125- m_startRequest .putInt ( messageLength );
126- m_startRequest .position ( 0 );
127+ m_startRequest = ByteBuffer .allocateDirect (4 + 4 + 4 + 4 );
128+ m_startRequest .putInt (16 );
129+ m_startRequest .putInt (sessions );
130+ m_startRequest .putInt (messages );
131+ m_startRequest .putInt (messageLength );
132+ m_startRequest .position (0 );
127133 }
128134
129- public void start ( SocketAddress addr )
135+ public void start (SocketAddress addr )
130136 {
131137 m_addr = addr ;
132138 for (int idx =0 ; idx <m_session .length ; idx ++)
@@ -143,9 +149,46 @@ public void stopAndWait()
143149 for (SessionThread session : m_session )
144150 session .join ();
145151 }
146- catch (InterruptedException ex )
152+ catch (final InterruptedException ex )
147153 {
148154 ex .printStackTrace ();
149155 }
150156 }
157+
158+ public static void main (String [] args )
159+ {
160+ int port ;
161+ int sessions = 1 ;
162+ int messages = 1000000 ;
163+ int messageLength = 500 ;
164+ int socketBufferSize = (64 *1024 );
165+
166+ if (args .length > 0 )
167+ {
168+ port = Integer .parseInt (args [0 ]);
169+ if (args .length > 1 )
170+ {
171+ sessions = Integer .parseInt (args [1 ]);
172+ if (args .length > 2 )
173+ {
174+ messages = Integer .parseInt (args [2 ]);
175+ if (args .length > 3 )
176+ {
177+ messageLength = Integer .parseInt (args [3 ]);
178+ if (args .length > 4 )
179+ socketBufferSize = Integer .parseInt (args [4 ]);
180+ }
181+ }
182+ }
183+ }
184+ else
185+ {
186+ System .out .println ("Usage: <port> [sessions] [messages] [message length] [socket buffer size]" );
187+ return ;
188+ }
189+
190+ final Client client = new Client (sessions , messages , messageLength , socketBufferSize );
191+ client .start (new InetSocketAddress ("localhost" , port ));
192+ client .stopAndWait ();
193+ }
151194}
0 commit comments