Java Reading from a buffered reader (from a socket) pauses the stream

I have a stream that reads characters from a buffered reader (created from a socket as follows):

inputStream = new BufferedReader(new InputStreamReader(clientSock.getInputStream())); 

This code only works once. For example, if a client connects and sends this message: “This is a test” and “This is another test”, the output of the host:

  Reading from stream: Chars read from stream: 16 This is a test Reading from stream: 

Please note that the program does not get “This is another test” because it gets stuck while reading the stream. Is there a way to handle this without decreasing the size of the buffer? This is the code for the stream:

 public void run() { boolean dataRecieved = false; char[] inputChars = new char[1024]; int charsRead = 0; while (!stopNow) { try { Thread.sleep(getDataDelay); //Read 1024 characters. Note: This will pause the thread when stream is empty. System.out.println("Reading from stream:"); charsRead = inputStream.read(inputChars); //<< THIS LINE IS PAUSING THE THREAD!> if ((charsRead = inputStream.read(inputChars)) != -1) { System.out.println("Chars read from stream: " + charsRead); System.out.println(inputChars); System.out.flush(); } } catch (IOException e) { System.out.println("IOException"); //TODO: CLIENT HAS DISCONNECTED... } catch (InterruptedException e) { System.out.println("Interrupted"); // Sleep was interrupted. } } } 

Code for client / sender (not my code):

 public static void main(String[] args) throws IOException { // <<<<<<<<<<< CLIENT >>>>>>>>>>>>>>> Socket sock = new Socket("127.0.0.1", 3000); // reading from keyboard (keyRead object) BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in)); // sending to client (pwrite object) OutputStream ostream = sock.getOutputStream(); PrintWriter pwrite = new PrintWriter(ostream, true); // receiving from server ( receiveRead object) InputStream istream = sock.getInputStream(); BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream)); System.out.println("Start the chitchat, type and press Enter key"); String receiveMessage, sendMessage; while(true) { sendMessage = keyRead.readLine(); // keyboard reading pwrite.println(sendMessage); // sending to server System.out.flush(); // flush the data if((receiveMessage = receiveRead.readLine()) != null) //receive from server { System.out.println(receiveMessage); // displaying at DOS prompt } } } 
+7
source share
5 answers

java.io.InputStream.read() is a lock , which means that if data is not available, the thread stops until the data becomes available.

For non-blocking I / O, use the classes from the java.nio package.

+9
source

Your "sender" expects to receive data from the "receiver", and this code expects an indefinite period. Is the receiver supposed to send a response when it receives a message?

+2
source

Implement a protocol in which you send the length of your data in your headers so that the server / client knows how much data to expect.

0
source
 Socket socket; // Assuming socket is connected and not null if(socket != null){ if(socket.getInputStream().available() > 0){ byte[] buffer; buffer = new byte[socket.getInputStream().available]; socket.getInputStream().read(buffer); // Your code here to deal with buffer. } } 

If you want to write to a socket,

 OutputStream mmOutStream; mmOutStream = socket.getOutputStream(); public void write(byte[] buffer) { try { mmOutStream.write(buffer); } catch (IOException e) { Log.e(TAG, "Exception during write ", e); } } 
0
source

You need to create a ServerSocket Listen client in each loop.

 ServerSocket socket = new ServerSocket(3000); 

Here is my run () method that will wait for the Socket client every time

 public void run(){ boolean dataRecieved = false; char[] inputChars = new char[1024]; int charsRead = 0; while (!stopNow) { try { System.out.println("Listen To Clients:"); // The ServerSocket has to listen the client each time. InputStreamReader isr = new InputStreamReader( socket.accept().getInputStream() ); inputStream = new BufferedReader( isr ); //Read 1024 characters. Note: This will pause the thread when stream is empty. System.out.println("Reading from stream:"); if ((charsRead = inputStream.read(inputChars)) != -1) { System.out.println("Chars read from stream: " + charsRead); System.out.println(inputChars); System.out.flush(); } } catch (IOException e) { e.printStackTrace(); } } } 

You have another small error that stops the code and removes the line

 charsRead = inputStream.read(inputChars); //<< THIS LINE IS PAUSING THE THREAD!> 

Because this line moves in the if .

-one
source

All Articles