Skip to main content

inputStream data lost



I am doing simple client-server in Java. This is my client code.







try {

socket = new Socket(serverIP, serverport);

dataStream = new DataOutputStream(new BufferedOutputStream(

socket.getOutputStream()));

long[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int i = 0; i < data.length; i++) {

dataStream.writeLong(data[i]);

System.out.println("So far" + dataStream.size());

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (socket != null)

try {

socket.close();

dataStream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}







This works fine because I can see that a mount of bytes have been written to the server. Here goes the server code.







try {

ServerSocket newSocket = new ServerSocket(2503);

while (true) {

connectionSocket = newSocket.accept();

input = new DataInputStream(new BufferedInputStream(connectionSocket.getInputStream()));

System.out.println(input.readLong());

}







However, none of data is successfully read from the server socket, the connectionSocket.getInputStream.available() returns 0 bytes. let's assume every variables were declared properly. Any idea why? Appreciate the help.


Comments

  1. Your loop is calling accept at each pass which will block until the next client attaches. So the first client attaches, it reads a long, prints that, then loops around blocking waiting for another connection to attach. You need to move that outside the loop. Probably in a separate thread because if you iterate over the stream on the same thread as the accept new clients cannot connect until it finishes with the first client. That's the next step, but here is how you fix your problem:

    try {
    ServerSocket newSocket = new ServerSocket(2503);
    while( !done ) {
    Socket nextClient = newSocket.accept();
    // it's better to start a thread and put the call to this method in there
    // so the thread owning the ServerSocket can loop back around and accept
    // another client should another connect while it's servicing this client
    handleNewClient( nextClient );
    }
    } finally {
    newSocket.close();
    }

    public void handleNewClient( Socket client ) {
    boolean done = false;
    DataInputStream in = new DataInputStream( new BufferedInputStream( client.getInputStream() ) );
    while( !done ) {
    try {
    Long l = in.readLong();
    System.out.println( l );
    } catch( EOFException e ) {
    // this is not a great way to end the conversation from a client.
    // better to either know how much you can read the stream (ie count of bytes),
    // or use a termination encoding. Otherwise you have to wait till the client
    // closes their side which throws EOFException.
    done = true;
    }
    }
    }

    ReplyDelete
  2. Flush/close the stream before closing the socket.

    [Was: flush/close the stream, before code was updated]

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.