[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.
> >>
> >>
> >>
>
>
>