Help with OutputStream.send() method. I want to know how much data this method already sent.

Discussion in 'Java' started by Dalton Barreto, Nov 5, 2006.

  1. Hi,

    I have a problem with my application that is:

    Some times I have to send data to a server, and I do this using this
    code:
    First I have to get the sockWriter:

    try {
    sock = getSocket();
    sockReader = sock.getInputStream();
    sockWriter = sock.getOutputStream();
    String recv = receiveSigleLineResponse();
    }catch (IOException e){
    throw new ConnectionException(e.getMessage());
    }

    ok, at this point everything works. The problem begins every time I
    need to send the data, and here is the code:

    sockWriter.write(new String(mailData + LINE_FEED + "." +
    LINE_FEED).getBytes());

    this lines works well, but once my program reaches this line of code,
    it "hangs" until this function
    returns, this is expected, of course. But I want the user to see a
    progress bar showing how much data has already been sent to the server.
    And I can't do this, because send() is blocking until all data have
    been sent.
    What I want is a way to keep checking how much data the function sent
    so I can update the progress bar.

    I don't know if I was clear, but thanks in advance.

    Thanks!
    Dalton Barreto;
    Dalton Barreto, Nov 5, 2006
    #1
    1. Advertising

  2. Dalton Barreto

    Daniel Pitts Guest

    Dalton Barreto wrote:
    > Hi,
    >
    > I have a problem with my application that is:
    >
    > Some times I have to send data to a server, and I do this using this
    > code:
    > First I have to get the sockWriter:
    >
    > try {
    > sock = getSocket();
    > sockReader = sock.getInputStream();
    > sockWriter = sock.getOutputStream();
    > String recv = receiveSigleLineResponse();
    > }catch (IOException e){
    > throw new ConnectionException(e.getMessage());
    > }
    >
    > ok, at this point everything works. The problem begins every time I
    > need to send the data, and here is the code:
    >
    > sockWriter.write(new String(mailData + LINE_FEED + "." +
    > LINE_FEED).getBytes());
    >
    > this lines works well, but once my program reaches this line of code,
    > it "hangs" until this function
    > returns, this is expected, of course. But I want the user to see a
    > progress bar showing how much data has already been sent to the server.
    > And I can't do this, because send() is blocking until all data have
    > been sent.
    > What I want is a way to keep checking how much data the function sent
    > so I can update the progress bar.
    >
    > I don't know if I was clear, but thanks in advance.
    >
    > Thanks!
    > Dalton Barreto;


    Two things.
    One, don't send all of the bytes in one chunk. Split it into different
    chunks.
    Two, print out how many chunks have been sent so far.
    Possibly having an 1024 byte chunk, you would be able to display(chunks
    + "k bytes have been sent")
    Daniel Pitts, Nov 5, 2006
    #2
    1. Advertising

  3. > Dalton Barreto wrote:
    > > Hi,
    > >
    > > I have a problem with my application that is:
    > >
    > > Some times I have to send data to a server, and I do this using this
    > > code:
    > > First I have to get the sockWriter:
    > >
    > > try {
    > > sock = getSocket();
    > > sockReader = sock.getInputStream();
    > > sockWriter = sock.getOutputStream();
    > > String recv = receiveSigleLineResponse();
    > > }catch (IOException e){
    > > throw new ConnectionException(e.getMessage());
    > > }
    > >
    > > ok, at this point everything works. The problem begins every time I
    > > need to send the data, and here is the code:
    > >
    > > sockWriter.write(new String(mailData + LINE_FEED + "." +
    > > LINE_FEED).getBytes());
    > >
    > > this lines works well, but once my program reaches this line of code,
    > > it "hangs" until this function
    > > returns, this is expected, of course. But I want the user to see a
    > > progress bar showing how much data has already been sent to the server.
    > > And I can't do this, because send() is blocking until all data have
    > > been sent.
    > > What I want is a way to keep checking how much data the function sent
    > > so I can update the progress bar.
    > >
    > > I don't know if I was clear, but thanks in advance.
    > >
    > > Thanks!
    > > Dalton Barreto;

    >
    > Two things.
    > One, don't send all of the bytes in one chunk. Split it into different
    > chunks.
    > Two, print out how many chunks have been sent so far.
    > Possibly having an 1024 byte chunk, you would be able to display(chunks
    > + "k bytes have been sent")




    So the class that sends the data has to know about the class that
    implements the
    progress bar, right?? This way the sender class will update the
    progress directly, and
    not the other way (the progress bar checking for total transfered
    data), what is the
    best way do implement this??

    I tried to do something like this:
    the class that sends the data increments a private variable, and the
    class tha implements
    the pBar keeps checking how much was sent so far. but this is bad,
    because the only
    way that I see to do this is: sleep some seconds e check again, then
    get the totalBytes
    transfered and do a += on the progerss status. But this is wrong,
    because if the connection
    is bad and the OS doesn't send any data in a short time slice the
    progress bar would show
    a inconsistent status (more data than actually transfered).


    Is there any other way to do this 'comunication', between the sender
    class and the pBar class, so the second show always a consistent status
    value?

    Thanks in advance!
    Dalton Barreto;

    PS: The class the send the data and the class that shows the progress
    bar are two different
    classes.
    Dalton Barreto, Nov 6, 2006
    #3
  4. Dalton Barreto

    Daniel Pitts Guest

    Dalton Barreto wrote:
    > So the class that sends the data has to know about the class that
    > implements the
    > progress bar, right?? This way the sender class will update the
    > progress directly, and
    > not the other way (the progress bar checking for total transfered
    > data), what is the
    > best way do implement this??
    >
    > I tried to do something like this:
    > the class that sends the data increments a private variable, and the
    > class tha implements
    > the pBar keeps checking how much was sent so far. but this is bad,
    > because the only
    > way that I see to do this is: sleep some seconds e check again, then
    > get the totalBytes
    > transfered and do a += on the progerss status. But this is wrong,
    > because if the connection
    > is bad and the OS doesn't send any data in a short time slice the
    > progress bar would show
    > a inconsistent status (more data than actually transfered).
    >
    >
    > Is there any other way to do this 'comunication', between the sender
    > class and the pBar class, so the second show always a consistent status
    > value?
    >
    > Thanks in advance!
    > Dalton Barreto;
    >
    > PS: The class the send the data and the class that shows the progress
    > bar are two different
    > classes.


    Look up JProgressBar
    (http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JProgressBar.html)
    if you are doing this in Swing.
    If not using Swing, you probably still want to use the observer
    pattern.

    Psuedo-code:

    class Uploader {
    ProgressListener listener; // You can also make this a list/array of
    listeners
    int progress = 0;
    public void doUpload() {
    for (Chunk chunk: chunksToUpload) {
    uploadChunk(chunk);
    listener.progressChanged(progress);
    }
    }
    }

    Alternativly , you could make progress a JavaBean bound property, and
    have the progress listener be a PropertyChangeListener, but thats more
    work for now, and until you need it, I suggest holding off.

    If you are doing this in Swing, make sure your event is fired off in
    the EventDispatchThread
    (http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html)

    Hope this helps. Good luck.
    Daniel Pitts, Nov 6, 2006
    #4
  5. > Dalton Barreto wrote:
    > > So the class that sends the data has to know about the class that
    > > implements the
    > > progress bar, right?? This way the sender class will update the
    > > progress directly, and
    > > not the other way (the progress bar checking for total transfered
    > > data), what is the
    > > best way do implement this??
    > >
    > > I tried to do something like this:
    > > the class that sends the data increments a private variable, and the
    > > class tha implements
    > > the pBar keeps checking how much was sent so far. but this is bad,
    > > because the only
    > > way that I see to do this is: sleep some seconds e check again, then
    > > get the totalBytes
    > > transfered and do a += on the progerss status. But this is wrong,
    > > because if the connection
    > > is bad and the OS doesn't send any data in a short time slice the
    > > progress bar would show
    > > a inconsistent status (more data than actually transfered).
    > >
    > >
    > > Is there any other way to do this 'comunication', between the sender
    > > class and the pBar class, so the second show always a consistent status
    > > value?
    > >
    > > Thanks in advance!
    > > Dalton Barreto;
    > >
    > > PS: The class the send the data and the class that shows the progress
    > > bar are two different
    > > classes.

    >
    > Look up JProgressBar
    > (http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JProgressBar.html)
    > if you are doing this in Swing.
    > If not using Swing, you probably still want to use the observer
    > pattern.
    >
    > Psuedo-code:
    >
    > class Uploader {
    > ProgressListener listener; // You can also make this a list/array of
    > listeners
    > int progress = 0;
    > public void doUpload() {
    > for (Chunk chunk: chunksToUpload) {
    > uploadChunk(chunk);
    > listener.progressChanged(progress);
    > }
    > }
    > }
    >
    > Alternativly , you could make progress a JavaBean bound property, and
    > have the progress listener be a PropertyChangeListener, but thats more
    > work for now, and until you need it, I suggest holding off.
    >
    > If you are doing this in Swing, make sure your event is fired off in
    > the EventDispatchThread
    > (http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html)
    >
    > Hope this helps. Good luck.



    It HELPS!! a Lot!! thanks!
    I was thinking about a design pattern, and I'm sure that this will
    solve my problem, and I will be
    able to reuse this "upload class" anytime I need.

    Thanks a lot Daniel.

    PS: Yes, I'm doing this in Swing. :)
    Dalton Barreto;
    Dalton Barreto, Nov 7, 2006
    #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. Alexandre Touret
    Replies:
    1
    Views:
    2,219
    Dal Mon
    Jun 8, 2005
  2. loffemoffe
    Replies:
    1
    Views:
    9,989
  3. vsingr
    Replies:
    0
    Views:
    5,489
    vsingr
    Jun 26, 2006
  4. Replies:
    2
    Views:
    3,572
  5. jt458
    Replies:
    0
    Views:
    959
    jt458
    May 17, 2007
Loading...

Share This Page