在Socket保持打开状态时打印BufferedReader

时间:2013-12-12 02:19:17

标签: java sockets tcp io telnet

我想要的只是打印到控制台的wunderground的回复:

public class Weather {

    public static void main(String[] args) {
        String host = "rainmaker.wunderground.com";
        int port = 3000;
        int c;
        {
            try (Socket socket = new Socket(host, port);
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
                    final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in))) {
                while (true) {
                    System.out.println(socket.toString());
                    c = bufferedReader.read();
                    System.out.print((char) c);
                }
            } catch (IOException ex) {
                System.out.println(ex + host + port);
                System.exit(1);
            } finally {
                System.exit(1);

            }
        }
    }
}

但是,没有太多的输出:

thufir@dur:~/NetBeansProjects/MudSocketClient$ 
thufir@dur:~/NetBeansProjects/MudSocketClient$ java -jar dist/MudSocketClient.jar 
Socket[addr=rainmaker.wunderground.com/38.102.137.140,port=3000,localport=53550]
^Cthufir@dur:~/NetBeansProjects/MudSocketClient$ 
thufir@dur:~/NetBeansProjects/MudSocketClient$ 

从CLI运行telnet,连接正常。

1 个答案:

答案 0 :(得分:0)

我找到了一些旧代码:

public class InputOutput extends Observable {

    private static final Logger log = Logger.getLogger(InputOutput.class.getName());
    private Alias alias = new Alias();

    public InputOutput() {
    }

    private void readFromConsole(final OutputStream outputStream) {
        Thread read = new Thread() {

            @Override
            public void run() {
                String line;
                byte[] bytes;
                Scanner scanner;
                while (true) {
                    GameDataBean gameData = null;
                    scanner = new Scanner(System.in);
                    line = scanner.nextLine();
                    try {
                        gameData = alias.parseUserInput(line);
                    } catch (StringIndexOutOfBoundsException e) {
                        log.fine(e.toString());
                    }
                    if (gameData != null) {
                        setChanged();
                        notifyObservers(gameData);
                    } else {
                        bytes = line.getBytes();
                        try {
                            outputStream.write(bytes);
                            outputStream.write(10);
                            outputStream.flush();
                        } catch (IOException ex) {
                            log.fine(ex.toString());
                        }
                    }
                }
            }
        };
        read.start();
    }

    private void readInput(final InputStream inputStream) throws FileNotFoundException, IOException {
        Thread readInput = new Thread() {

            @Override
            public void run() {
                char ch = 0;
                int intVal = 0;
                StringBuilder sb = new StringBuilder();
                try {
                    while ((intVal = inputStream.read()) != -1) {
                        ch = (char) intVal;
                        printToConsole(ch);
                        //logToFile(ch);
                        sb.append(ch);
                        if (intVal == 13) {
                            setChanged();
                            notifyObservers(sb.toString());
                            sb = new StringBuilder();
                        }
                    }
                } catch (IOException ex) {
                    Logger.getLogger(InputOutput.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            private void logToFile(char c) throws IOException {
                String fname = "weather.log";
                File f = new File(fname);
                f.createNewFile();
                try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fname, true)))) {
                    out.print(c);
                    out.flush();
                }
            }

            private void printToConsole(char c) {
                System.out.print(c);
            }
        };
        readInput.start();
    }

    public void readWriteParse(final InputStream inputStream, final OutputStream outputStream) throws FileNotFoundException, IOException {
        readFromConsole(outputStream);
        readInput(inputStream);
    }
}

我认为,当套接字仍处于打开状态时,它必须是多线程的,我记得。