Simple socket conumdrum

Discussion in 'Java' started by Will Hartung, Jan 19, 2005.

  1. Will Hartung

    Will Hartung Guest

    I have a brain dead Client and equally unsophisticated Server program.

    The Client connects to the Server, server pops a thread, and then they have
    a simple conversation.

    The basic goal of the C/S system is simply to Move Data in order to evaluate
    timings and what not for a project.

    I don't care WHAT the data is, I just want to move some.

    Here's the meat of the Server:

    I get the InputStream using:

    InputStream is = socket.getInputStream();

    My blocksize is 8192.

    Then, I run this little loop:
    while(totalRcvd != totalCnt) {
    int amtToRead = blocksize;
    if (amtToRead > (totalCnt - totalRcvd)) {
    amtToRead = totalCnt - totalRcvd;
    }
    int amtRcvd = is.read(buffer, 0, amtToRead);
    totalRcvd = totalRcvd + amtRcvd;
    }

    For a small amount of data, 10240 bytes, this works fine.

    When I bump up to 102400 bytes, it hangs about 70% of the way into the total
    amount, meanwhile the client thinks that it has completed sending the data
    and is awaiting acknowledgment from the server.

    If I kill the client at this point, then the sockets are closed and I get an
    appropriate exception on the server.

    Finally, running the client and server on my windows machine, it works
    (though it is not consistent). It consistently fails with the server on a
    Solaris 8 machine.

    Anyone have any hints why this is hanging up?

    Thanx!

    Regards,

    Will Hartung
    ()
     
    Will Hartung, Jan 19, 2005
    #1
    1. Advertising

  2. Will Hartung

    dar7yl Guest

    > When I bump up to 102400 bytes, it hangs about 70% of the way into the
    > total
    > amount, meanwhile the client thinks that it has completed sending the data
    > and is awaiting acknowledgment from the server.


    It sounds like the http socket is timing out.
    Try turning off buffering for the output, and write a block at a time.
    (btw, I didn't see anywhere you are actually writing the data to the
    client)

    as a matter of style, recode your loop as follows:
    (the brace style is your own preference, I abhor K&R style)
    <code>
    int remainder = totalCnt;
    while (remainder > 0)
    {
    int amtToRead = remainder ;
    if (amtToRead > BLOCKSIZE)
    {
    amtToRead = BLOCKSIZE;
    }
    int amtRcvd = is.read(buffer, 0, amtToRead);
    remainder -= amtRcvd;

    // now, what are you doing with your buffer here?
    } // while
    </code>

    regards,
    Dar7yl

    "Will Hartung" <> wrote in message
    news:...
    >I have a brain dead Client and equally unsophisticated Server program.
    >
    > The Client connects to the Server, server pops a thread, and then they
    > have
    > a simple conversation.
    >
    > The basic goal of the C/S system is simply to Move Data in order to
    > evaluate
    > timings and what not for a project.
    >
    > I don't care WHAT the data is, I just want to move some.
    >
    > Here's the meat of the Server:
    >
    > I get the InputStream using:
    >
    > InputStream is = socket.getInputStream();
    >
    > My blocksize is 8192.
    >
    > Then, I run this little loop:
    > while(totalRcvd != totalCnt) {
    > int amtToRead = blocksize;
    > if (amtToRead > (totalCnt - totalRcvd)) {
    > amtToRead = totalCnt - totalRcvd;
    > }
    > int amtRcvd = is.read(buffer, 0, amtToRead);
    > totalRcvd = totalRcvd + amtRcvd;
    > }
    >
    > For a small amount of data, 10240 bytes, this works fine.
    >
    > When I bump up to 102400 bytes, it hangs about 70% of the way into the
    > total
    > amount, meanwhile the client thinks that it has completed sending the data
    > and is awaiting acknowledgment from the server.
    >
    > If I kill the client at this point, then the sockets are closed and I get
    > an
    > appropriate exception on the server.
    >
    > Finally, running the client and server on my windows machine, it works
    > (though it is not consistent). It consistently fails with the server on a
    > Solaris 8 machine.
    >
    > Anyone have any hints why this is hanging up?
    >
    > Thanx!
    >
    > Regards,
    >
    > Will Hartung
    > ()
    >
    >
     
    dar7yl, Jan 20, 2005
    #2
    1. Advertising

  3. "Will Hartung" <> wrote in message
    news:...
    > I have a brain dead Client and equally unsophisticated Server program.
    >
    > The Client connects to the Server, server pops a thread, and then they

    have
    > a simple conversation.
    >
    > The basic goal of the C/S system is simply to Move Data in order to

    evaluate
    > timings and what not for a project.
    >
    > I don't care WHAT the data is, I just want to move some.
    >
    > Here's the meat of the Server:
    >
    > I get the InputStream using:
    >
    > InputStream is = socket.getInputStream();
    >
    > My blocksize is 8192.
    >
    > Then, I run this little loop:
    > while(totalRcvd != totalCnt) {
    > int amtToRead = blocksize;
    > if (amtToRead > (totalCnt - totalRcvd)) {
    > amtToRead = totalCnt - totalRcvd;
    > }
    > int amtRcvd = is.read(buffer, 0, amtToRead);
    > totalRcvd = totalRcvd + amtRcvd;
    > }


    Just for completeness sake, are you sure you set totalRcvd to 0 after each
    message? Also, how is totalCnt count assigned? Are you sure it's the same
    for both? (e.g. is it sent as a 2-byte prefix or a 4-byte prefix?) Is the
    data being sent as bytes (not characters) down a corresponding Output
    Stream?

    Cheers,
    Matt Humphrey http://www.iviz.com/
     
    Matt Humphrey, Jan 20, 2005
    #3
  4. Will Hartung wrote:
    > I have a brain dead Client and equally unsophisticated Server program.
    >
    > The Client connects to the Server, server pops a thread, and then they have
    > a simple conversation.
    >
    > The basic goal of the C/S system is simply to Move Data in order to evaluate
    > timings and what not for a project.
    >
    > I don't care WHAT the data is, I just want to move some.
    >
    > Here's the meat of the Server:
    >
    > I get the InputStream using:
    >
    > InputStream is = socket.getInputStream();
    >
    > My blocksize is 8192.
    >
    > Then, I run this little loop:
    > while(totalRcvd != totalCnt) {
    > int amtToRead = blocksize;
    > if (amtToRead > (totalCnt - totalRcvd)) {
    > amtToRead = totalCnt - totalRcvd;
    > }
    > int amtRcvd = is.read(buffer, 0, amtToRead);
    > totalRcvd = totalRcvd + amtRcvd;
    > }
    >
    > For a small amount of data, 10240 bytes, this works fine.
    >
    > When I bump up to 102400 bytes, it hangs about 70% of the way into the total
    > amount, meanwhile the client thinks that it has completed sending the data
    > and is awaiting acknowledgment from the server.
    >
    > If I kill the client at this point, then the sockets are closed and I get an
    > appropriate exception on the server.
    >
    > Finally, running the client and server on my windows machine, it works
    > (though it is not consistent). It consistently fails with the server on a
    > Solaris 8 machine.
    >
    > Anyone have any hints why this is hanging up?


    Nothing jumps out at me. Try printing totalRcvd and amtToRead just before
    you call is.read(), and printing totalRcvd just after it returns, and
    see if they make sense.

    Also, changing while(totalRecvd != totalCnt) to
    while(totalRecvd < totalCnt) would feel more robust to me.

    Steve
     
    Steve Horsley, Jan 20, 2005
    #4
  5. Will Hartung

    Esmond Pitt Guest

    Will Hartung wrote:

    > while(totalRcvd != totalCnt) {
    > int amtToRead = blocksize;
    > if (amtToRead > (totalCnt - totalRcvd)) {
    > amtToRead = totalCnt - totalRcvd;
    > }
    > int amtRcvd = is.read(buffer, 0, amtToRead);
    > totalRcvd = totalRcvd + amtRcvd;
    > }


    Consider what happens if you get a premature EOF. You aren't checking
    for this condition, you're assuming that all the data will arrive. Very
    optimistic ...
     
    Esmond Pitt, Jan 21, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Laszlo Nagy
    Replies:
    1
    Views:
    5,013
    Mark Wooding
    Jan 27, 2009
  2. Jean-Paul Calderone
    Replies:
    0
    Views:
    1,013
    Jean-Paul Calderone
    Jan 27, 2009
  3. Laszlo Nagy
    Replies:
    0
    Views:
    584
    Laszlo Nagy
    Feb 1, 2009
  4. Steve Holden
    Replies:
    0
    Views:
    699
    Steve Holden
    Feb 1, 2009
  5. Steve Holden
    Replies:
    1
    Views:
    746
Loading...

Share This Page