[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: InputStream



I'll supply a hack for the group incase someone else has this problem.

#!/bin/sh


stty -icanon -echo
java -jar dconnect.jar $@

# SH should (if it is not stupid) reset or line
# discipline to what it was before the exec() but
# We may be dealing with some chump's homegrown version
# of a shell
stty icanon echo




One problem I'm getting is here:public void run() {
    int i;
    try {
      while(true) {
        in.mark(1);
        i = in.read();
        if(Main.sock.isConnected() == false) {
          System.err.println("Remote host closed connection");
          System.exit(0);
        }
        out.write((byte)i);
        out.flush();
      }
    } catch (Exception e) {


If I close the socket on the other end, with the close() system call.
Then this tool does not see that close.  It starts streaming garbage to
the screen.  Am I missing something?





On Tue, 2003-01-28 at 14:11, John Wells wrote:
> Chris,
> 
> I think this is more a fault of the terminal io as opposed to java.  For
> instance, this in C:
> 
> char c;
> 
> while (1==1)
> {
>     c = getchar();
>     printf("[%c]", c);
> }
> 
> has the same behavior as this in Java:
> 
> while(1==1)
> {
>     char c = 0;
>     try { c = (char) System.in.read();}
>     catch(Exception e){e.printStackTrace();}
>     System.out.print("[" + c + "]");
> }
> 
> They both wait until the new line char is entered before processing.  I
> think the terminal uses the readine() function for terminal input, and
> it's line buffered.  If you were to create your own inputstream and
> provide a stream of data through it to test (perhaps read a file?), rather
> that command line input, I suspect behavior might be different.
> 
> John
> 
> cfowler said:
> >   public void run() {
> >     int i;
> >     try {
> >       while(true) {
> >         in.mark(1);
> >         i = in.read();
> >         System.out.print("[" + (char)i + "]");
> >         if(Main.sock.isConnected() == false) {
> >           System.err.println("Remote host closed connection");
> >           System.exit(0);
> >         }
> >         out.write((byte)i);
> >         out.flush();
> >       }
> >     } catch (Exception e) {
> >
> >
> > If I type Hello, I does not display [H] after the first H, it waits till
> > I press return to.  The tty is passed to Java in cooked mode and must be
> > converted by java in raw mode.  This is the key.  Otherwise, I'l write
> > this in C :(
> >
> >
> >
> > On Tue, 2003-01-28 at 13:45, John Wells wrote:
> >> Chris,
> >>
> >> Hmm...afaik System.in.read() should only read the next byte from the
> >> stream.
> >>
> >> Have you attempted to print the char/byte out to see exactly what
> >> you're getting?
> >>
> >> When you say it's behaving in line mode, what is leading you to
> >> believe this?  Can you provide a sample of what you're trying to read
> >> in, and what you're actually getting?
> >>
> >> If you're inputing from the command line, it's buffered input using
> >> readline(), I believe, so System.in.read() in your Java program won't
> >> get any characters until your shell sees a newline and submits.
> >>
> >> John
> >>
> >> cfowler said:
> >> > Is there a way to convert an InputStream like System.in. from what
> >> appears to be line-mode to char mode?
> >> >
> >> > I'm doing this:
> >> >
> >> > int i = System.in.read();
> >> > sockOutStream.write(i);
> >> >
> >> > It behaves as if I'm in line mode.
> >>
> >>
> >>
> 
> 
>